solr java浏览器访问_solr解决访问安全

Tomcat7,solr3.6,mmseg1.8

1:环境的搭建

1:解压tomcat,solr,mmseg4j

2:复制dist文件夹下apache-solr.war到tomcat的webapp文件夹下,修改文件名为solr(不该也行,这里修改文件名方便一会地址栏的输入)

3:创建solr-tomcat文件夹作为solr的根目录

4:tomcat/conf/Catalina/localhost文件夹(不存在手动创建)下创建solr.xml,文件内容如下,根据情况,修改相应的路径

5:复制solr解压后,example文件夹下的solr文件夹到solr-tomcat文件夹下

6:访问http://localhost:8080/solr/,验证是否配置成功(访问后,solr-tomcat/solr文件夹下会多一个data文件夹)

2:配置文件的说明

1:apache-tomcat-7.0.19\conf\Catalina\localhost\solr.xml文件,用来配置solr的根目录,目前只用到一次

2:E:\solr-tomcat\solr\solr.xml文件,目前只看到在配置多核时用到,后面讲

3:E:\solr-tomcat\solr\conf\schema.xml文件(非常重要)

配置域的类型

配置域,在doc文档中的用到的field和solrj中用到的域名必须在这里配置。Index表示是否需要索引,stored是否需要存储,multiValued表示是否有多个值

就是动态匹配

在搜索时可以直接通过“zhang san”来搜索那么,不需要在通过“name:zhang san”来搜索

4:E:\solr-tomcat\solr\conf\solrconfig.xml文件:缓存,请求的配置,索引的配置

3:浏览器客户端的说明

Solr->analyze:分词

Query String:根据索引搜索时用。eg:name:zhang san可以通过name来搜索姓名是zhang san的人。如果配置了copyField也可以直接通过zhang san来搜索

4:中文分词的配置

1:解压mmseg4j,拷贝mmseg4j-all-1.8.5.jar到tomcat\webapp\solr的lib目录下

2:solr-tomcat\solr下创建dic文件夹,存放词库;拷贝mmseg4j下的words.dic到该目录下

3:修改schema.xml文件,添加如下代码(注意修改路径)

4:测试中文分词是否起作用

复制一段中文到Field value中;Field选择name输入complex,测试分词

name在使用name(没有配置中文分词,使用默认的)再次进行测试

5:多核的配置

1:拷贝example\multicore文件夹下的core0,core1,solr.xml到solr-tomcat\solr文件夹下

2:方位http://localhost:8080/solr/

使用浏览器客户端创建索引,搜索

4:创建索引(xml,json,cvs格式的文件cookbook)

1:复制solr解压后的,example文件夹下的exampledocs目录到solr-tomcat下(里面包含了一些测试索引用到的文件)

2:命令行创建索引:E:\solr-tomcat\exampledocs>java -Durl=http://localhost:8080/solr/update -Dcommit=yes -jar post.jar m*.xml,对该文件夹下所有以m开头的xml文件创建索引,此时solr-tomcat\solr\data文件夹下多了一些文件,有段文件,域文件,索引文件等

3:通过浏览器进行搜索,必须通过一个完整的分词(一个完整的单词,不能用a,m,z等搜索,同时this,that等也不能用于搜索)

5:更新索引

更新索引一般都是通过删除索引,然后再创建

6:删除索引

Solrj的使用

private static final String DEFAULT_URL = "http://localhost:8080/solr/";

1:创建索引(如何对一个指定格式的xml创建索引还不清楚)

对文件进行索引

public void index() throws SolrServerException, IOException {

SolrServer solrServer = new HttpSolrServer(DEFAULT_URL);

SolrInputDocument document = new SolrInputDocument();

document.addField("id", "1"); //id必须有

document.addField("name", "test");

document.addField("path", "测试"); //path需要在schema.xml中定义

solrServer.add(document);

solrServer.commit();

}

对Bean进行索引

public class SolrItem {

/**

* id,对应Solr中记录的Id

*/

@Field("id")

public String id;

/**

* 员工姓名

*/

@Field("title")

public String empName;

/**

* 员工邮箱

*/

@Field("subject")

public String email;

...

}

public void index() throws SolrServerException, IOException {

SolrItem item = new SolrItem();

item.setId("1");

item.setEmpName("张三");

item.setEmail("test@ppstream.com");

solrServer.addBean(item);

solrServer.commit();

}

2:搜索

public void query(String query) {

SolrParams params = new SolrQuery(query);

try {

QueryResponse response = solrServer.query(params);

SolrDocumentList list = response.getResults();

for (int i = 0; i < list.size(); i++) {

fail(list.get(i));

}

} catch (SolrServerException e) {

e.printStackTrace();

}

}

3:删除索引

public void delete(String params) throws SolrServerException, IOException {

solrServer.deleteByQuery(params);

//solrServer.deleteById(params);

}

4:高亮显示

public SolrDocumentList query(String str) {

SolrQuery query = new SolrQuery(str);

//设置高亮,以下两种方式都行(相当于开启高亮功能)

//query.setHighlight(true);

query.setParam("hl", "true"); //highlighting

//设置高亮显示的请求,高亮显示的内容由该参数决定,但是返回结果还是由SolrQuery决定

//query.setParam("hl.q", "email:zhang@ppstream.com");

/*

* 那些字段高亮显示,可以用空格或者逗号分隔(有一个域的时候正常,两个及以上没测试通过)

* 老版本使用query.addHighlightField("name");query.addHighlightField("description");给多个字段开启高亮功能

*/

query.setParam("hl.fl", "name");

//高亮显示字段前后添加html代码

query.setHighlightSimplePre("");

query.setHighlightSimplePost("");

SolrDocumentList list = new SolrDocumentList();

SolrDocument document = null;

QueryResponse response=new QueryResponse();

try {

SolrDocumentList documents = response.getResults();

//第一个Map的键是文档的ID,第二个Map的键是高亮显示的字段名

Map>> map = response.getHighlighting();

for(int i=0;i

document = documents.get(i);

document.setField("name", map.get(document.getFieldValue("id")).get("name"));

/*document.setField("email", map.get(document.getFieldValue("id")).get("email"));*/

list.add(document);

}

} catch (Exception e) {

}

return list;

}

Solr的其他应用

1:对一篇文章的前100个分词字创建索引

有时可能需要对某个字段(文章的内容content)的前1000个字符创建索引并存储,可以在solrconfig.xml中添加1000实现(默认是1万)。这里是分词数量,不是汉字或字母的个数。

2:配置中文分词后,如果查询“java编程思想”,会自动拆分成java,编程,思想3个分词依次进行查找

3:多条件查询

可以通过“编程 AND empName:XXX”进行查询,或者“编程 OR empName:XXX”等

4:字段当做一个整体,不进行分词

如果某个字段不需要使用分词,eg:java编程思想,只有在输入完成的书名:java编程思想才会搜索出来,可以在书名字段上的type使用不带分词的类型(schema.xml中配置)

5:检索索引中的部分字段

有时索引中可能存放很多信息,eg:书名,作者,出版时间,ISBN…….;在某次查询中,我们只需要搜索结果书名和作者即可。可以通过如下方式实现

SolrQuery query = new SolrQuery(param);

//返回的结果

String[] str = {"title", "author"};

query.setFields(str);

6:Solr的分页

SolrQuery query = new SolrQuery("*:* AND (empName:XXX OR empName:XX)");

query.setHighlight(true);

query.setStart(0);

query.setRows(2);

QueryResponse response = solrServer.query(query);

long totalCount = response.getResults().getNumFound();

totalCount返回的是满足条件的总记录条数,并不一定是0或2

7:solrj高亮显示时,只显示字段部分内容

SolrDocumentList list = response.getResults();

Map>> map = response.getHighlighting();

//对应的高亮字段(假设是content)。在list中显示正确,map中显示的只是content中的一部分。

query.setHighlightFragsize(100000); //可以通过这种方法改变,设置一个比list中,对应content内容大的数字

query.setHighlightSnippets(0);//或者设置高亮片段为0,这样关键字也就不会在高亮显示

8:搜索条件的部分关键字高亮显示

有时我们查询根据条件“java OR (empId:1000 AND empId:1001)”搜索时,结果如果高亮显示,可能出现1000,1001数字也会高亮,但是我们只希望java关键字高亮,这个时候可以用下面的方法

query.setParam("hl.q", "lucene solr");只对lucene和solr关键字进行高亮显示(solr不作为搜索条件也可以)

9:显示第一个匹配关键字附近的部分内容

有时我们需要显示检索出内容的一部分(在列表页,只需要显示一个概要信息),这时候可以通过设置query.setHighlightFragsize(100000);的大小来控制

10:schema文件,copyField配置

11:自动补全

搜索时在title和content上进行搜索,所以自动补全时要在title和content上同时进行。但是自动补全只能在一个字段上进行(目前我知道这样),所以就创建一个新字段searchField=title+”,”+content用来进行自动补全的提示,该字段仅用来索引不需要存储。

SolrQuery query = new SolrQuery(q);

query.addTermsField(searchField);

query.setTerms(true);

query.setTermsLimit(limit);

query.setTermsLower(pre);

query.setTermsPrefix(pre);

query.setQueryType("/terms");

QueryResponse qr = solrServer.query(query);

TermsResponse resp = qr.getTermsResponse();

List list = resp.getTerms(searchField);

这种搜索存在的问题:

1: q:empName:XXX AND projecteId:19    pre:lucen   在搜索时,返回的TermsResponse结果只应用了pre一个条件

2: title,content无法配置copyField字段使用complex(原因及解决办法没找到)

解决方法:改用Facet替换Term

SolrQuery query = new SolrQuery(q);

query.setFacet(true);

query.addFacetField(searchField);

query.setFacetLimit(limit);

query.setFacetPrefix(pre);

QueryResponse qr = solrServer.query(query);

List fss = qr.getFacetFields();

FacetField ff = fss.get(0);

return ff.getValues();

返回的fss结果仍然是根据pre一个条件返回的结果集,但是不满足条件query的结果集中,对应的count为0,即出现了0次

12:solr删除索引后,索引文件还存在,但是搜索结果已经不存在

13:添加tomcat验证,防止用户直接通过地址栏访问solr,进行修改删除索引

1:修改tomcat-user.xml文件

2:修改solr的web.xml文件,添加如下代码,对所有的请求,都需要tomcat用户及密码的验证

solr

/*

GET

POST

This applies only to the "tomcat" security role

admin

BASIC

admin

3:使用该方法后,通过solrj也不能直接访问,修改如下

String url = PropertiesSon.getText("solr.serverUrl");

String username = PropertiesSon.getText("solr.username");

String password = PropertiesSon.getText("solr.password");

String host = PropertiesSon.getText("solr.host");

int port = Integer.parseInt(PropertiesSon.getText("solr.port"));

DefaultHttpClient httpclient = new DefaultHttpClient();

httpclient.getCredentialsProvider().setCredentials(

new AuthScope(host, port),

new UsernamePasswordCredentials(username, password));

solrServer = new HttpSolrServer(url, httpclient);

4:使用该方法创建时,删除添加索引报错“Cannot retry request with a non-repeatable request entity.”

修改方法:url用http://username:password@10.1.11.165:8081/solr取代http://10.1.20.57:8081/solr(httpclient使用 4.2是时正常,使用4.1时,在删除新增索引仍然会报上面的错误)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550602.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java heap buffer direct buffer_java NIO - DirectBuffer 和 HeapBuffer

问题 &#xff1a;DirectBuffer 属于堆外存&#xff0c;那应该还是属于用户内存&#xff0c;而不是内核内存&#xff1f;FileChannel 的read(ByteBuffer dst)函数,write(ByteBuffer src)函数中&#xff0c;如果传入的参数是HeapBuffer类型,则会临时申请一块DirectBuffer,进行数…

yii2 提供接口给java_yii2写api接口步骤

yii2写api接口步骤Yii2如何实现RESTful风格的API(推荐&#xff1a;《YII教程》 )1、建立单独的应用程序为了增加程序的可维护性&#xff0c;易操作性&#xff0c;我们选择新建一套应用程序&#xff0c;这也是为了和前台应用、后台应用区分开操作。在WEB前端(frontend)和后端(ba…

java caller_js中的caller和callee属性

caller返回一个对函数的引用&#xff0c;该函数调用了当前函数。functionName.callerfunctionName 对象是所执行函数的名称。如果一个函数f是在全局作用域内被调用的,则f.caller为null,相反,如果一个函数是在另外一个函数作用域内被调用的,则f.caller指向调用它的那个函数.该属…

mysql 备份 php_PHP备份/还原MySQL数据库的代码

一、备份数据库并下载到本地// 设置SQL文件保存文件名$filenamedate("Y-m-d_H-i-s")."-".$cfg_dbname.".sql";// 所保存的文件名header("Content-disposition:filename".$filename);header("Content-type:application/octetstrea…

java代码修改触发编译_gcc -O0仍然优化了“未使用”的代码 . 是否有一个编译标志来改变它?...

当我在this question中提出时&#xff0c;gcc正在移除(是的&#xff0c;使用 -O0 )一行代码 _mm_div_ss(s1, s2); &#xff0c;大概是因为结果未保存 . 但是&#xff0c;这应该触发浮点异常并引发SIGFPE&#xff0c;如果删除调用则不会发生这种情况 .Question &#xff1a;是否…

java第二部分项目_Java_第二次作业:项目构思与实现

写在最前&#xff1a;我我我我我我靠&#xff0c;以后再也不再ddl截止前1小时调试程序了&#xff01;之前在DDL前1小时修改程序&#xff0c;当我改完后&#xff0c;我想着&#xff0c;再把之前的测试样例跑一遍&#xff0c;如果都对就OK了。就在这时&#xff0c;问题出现了&…

java远程插件动态注册机制_Spring运行时动态注册bean的方法

在spring运行时&#xff0c;动态的添加bean,dapeng框架在解析xml的字段时&#xff0c;使用到了动态注册&#xff0c;注册了一个实现了FactoryBean类&#xff01;定义一个没有被Spring管理的Controllerpublic class UserController implements InitializingBean{private UserSer…

java变量用来干嘛_Java

一、Maven的简介1、Maven是什么&#xff1f;Apache Maven是一个软件项目管理的综合工具。基于项目对象模型(POM)的概念&#xff0c;提供了帮助管理构建、文档、报告、依赖、发布等方法&#xff0c;Maven简化和标准化项目建设过程。处理编译&#xff0c;分配&#xff0c;文档&am…

mysql 视图 数据相加_MySQL

查看安装路径ps -ef|grep mysql1&#xff0c;配置linux虚拟机&#xff0c;修改IP????? vim /etc/sysconfig/network-scripts/ifcfg-eth02&#xff0c;配置完网卡之后&#xff0c;执行清空命令3&#xff0c;reboot查看生产环境上传文件MySQL5.5编译方式安装过程参考连接&am…

mllib协同过滤 java实现_协同过滤(ALS)算法介绍及Spark MLlib调用实例(Scala/Java/Python)...

协同过滤算法介绍&#xff1a;协同过滤常被用于推荐系统。这类技术目标在于填充“用户&#xff0d;商品”联系矩阵中的缺失项。Spark.ml目前支持基于模型的协同过滤&#xff0c;其中用户和商品以少量的潜在因子来描述&#xff0c;用以预测缺失项。Spark.ml使用交替最小二乘(ALS…

java编程启蒙_程序设计入门—Java语言

第一周&#xff1a;做点计算1.1 第一个程序如何下载、安装Eclipse和JRE&#xff0c;并且简单介绍一下这个软件的几个主要部分&#xff1b;如何在Eclipse中编辑、编译和运行程序&#xff1b;详解第一个程序&#xff1a;程序框架、输出、出错怎么办&#xff1b;做点计算&#xff…

python中什么是关键字参数_Python中的关键字参数

关键字参数与函数调用有关。在函数调用中使用关键字参数时&#xff0c;调用者通过参数名称标识参数。由于Python解释器能够使用提供的关键字来将值与参数进行匹配&#xff0c;因此您可以跳过参数或将其乱序放置。您还可以通过以下方式对printme()函数进行关键字调用-示例#!/usr…

java 任意代码执行漏洞_php-fpm在nginx特定环境下的任意代码执行漏洞(CVE-2019-11043)...

目录0x01 漏洞介绍0x02 漏洞影响0x03 漏洞复现0x01 漏洞介绍在长亭科技举办的 Real World CTF 中&#xff0c;国外安全研究员 Andrew Danau 在解决一道 CTF 题目时发现&#xff0c;向目标服务器 URL 发送%0a符号时&#xff0c;服务返回异常&#xff0c;疑似存在漏洞。在nginx上…

c enum能像java一样吗_不一样的Java Enum

Emum是在Java5中引入的新特性&#xff0c;从那开始&#xff0c;它被广泛的用在不同的Java应用中&#xff0c;相比于C和C的Enum&#xff0c;Java的Enum功能更加强大。但是很多开发人员暂时还没意识到它的强大之处&#xff0c;在Enum的一些细节问题上把握的还不到位。Enum的特性及…

java se 9.0.4_jre 9下载(Java SE Runtime Environment)下载

JRE9官方下载是运行JAVA程序不可缺少的环境。JRE中由ClassLoader负责查找和加载程序引用到的类库&#xff0c;基础类库ClassLoader会到rt.jar中自动加载&#xff0c;其它的类库&#xff0c;ClassLoader在环境变量CLASSPATH指定的路径中搜索&#xff0c;按照先来先到的原则&…

php+数组存放文件名_php将数组存储为文本文件的三种方法

本篇文章主要介绍php将数组存储为文本文件的三种方法&#xff0c;感兴趣的朋友参考下&#xff0c;希望对大家有所帮助。(1)利用serialize 将数组序列化存储为文本文件&#xff0c;调用时候再使用unserialize 还原<?php $file./cache/phone.php;$arrayarray(color> array…

php 屏蔽ctrl c,ctrl+c用不了怎么回事

解决办法&#xff1a;首先在运行里输入clipbrd打开剪贴板查看器看看里面是什么东西如果是剪贴板卡死了的话重启可解决问题如果不是复制个别的东西还是那个那么需要杀毒了&#xff01;(可能是灰鸽子病毒&#xff0c;冲击、震荡、狙击等都有可能导致不能复制粘贴剪切)方法一&…

php生日计算年龄,php根据生日计算年龄的方法

摘要&#xff1a;本文实例讲述了php根据生日计算年龄的方法。分享给大家供大家参考。具体如下&#xff1a;<?php function birthday($birthday){$age strtotime($birthday);if($age false){return false;本文实例讲述了php根据生日计算年龄的方法。分享给大家供大家参考。…

jq php异步上传图片,php+jquery Ajax异步上传图片(ajaxSubmit)实例_PHP教程

$photo_typesarray(image/jpg, image/jpeg,image/png,image/pjpeg,image/gif,image/bmp,image/x-png);//定义上传格式$max_size700000; //上传照片大小限制,默认700k$photo_folder"upload/".date("Y")."/".date("m")."/".da…

solaris php,针对 Solaris 的安装提示

用户评论:[#1]ariedederde [2011-06-18 00:58:25]Install php on solaris express:pkg search phppart of output is e.g.pkg:/web/php-525.2.12-0.151.0.1pkg install php-52php binary installs in /usr/php/5.2/bin/php[#2]julie at baumler dot com [2006-12-28 21:22:35]T…