`
zhchx0827
  • 浏览: 191535 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

solr入门学习

 
阅读更多

Tomcat7solr3.6mmseg1.8

1:环境的搭建

1:解压tomcatsolrmmseg4j

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

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

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

<Context docBase="E:/tomcat7/apache-tomcat-7.0.19/webapps/solr" reloadable="true" >

<Environment name="solr/home" type="java.lang.String" value="E:/solr-tomcat" override="true" />

</Context>

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

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

 

2:配置文件的说明

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

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

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

<fieldType name="string" class="solr.StrField" sortMissingLast="true" />配置域的类型

<field name="name" type="text_general" indexed="true" stored="true"/>配置域,在doc文档中的用到的fieldsolrj中用到的域名必须在这里配置。Index表示是否需要索引,stored是否需要存储,multiValued表示是否有多个值

<dynamicField name="*_s" type="string" indexed="true" stored="true"/>就是动态匹配

<copyField source="name" dest="text"/>在搜索时可以直接通过“zhang san”来搜索那么,不需要在通过“name:zhang san”来搜索

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

 

3:浏览器客户端的说明

Solr->analyze:分词

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

 

4:中文分词的配置

1:解压mmseg4j,拷贝mmseg4j-all-1.8.5.jartomcat\webapp\solrlib目录下

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

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

<!--mmseg4j field types-->

<fieldType name="textComplex" class="solr.TextField" positionIncrementGap="100" >

<analyzer>

<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="E:/solr-tomcat/solr/dic"/>

<filter class="solr.LowerCaseFilterFactory"/>

</analyzer>

</fieldType>

<fieldType name="textMaxWord" class="solr.TextField" positionIncrementGap="100" >

<analyzer>

<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="max-word" dicPath="E:/solr-tomcat/solr/dic"/>

<filter class="solr.LowerCaseFilterFactory"/>

</analyzer>

</fieldType>

<fieldType name="textSimple" class="solr.TextField" positionIncrementGap="100" >

<analyzer>

<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="E:/solr-tomcat/solr/dic"/>

<filter class="solr.LowerCaseFilterFactory"/>

</analyzer>

</fieldType>

 

 

<field name="simple" type="textSimple" indexed="true" stored="true" multiValued="true"/>

<field name="complex" type="textComplex" indexed="true" stored="true" multiValued="true"/>

<field name="text" type="textMaxWord" indexed="true" stored="true" multiValued="true"/>

 

<copyField source="simple" dest="text"/>

<copyField source="complex" dest="text"/>

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

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

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

 

 

5:多核的配置

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

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

 

 

 

 

 

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

4:创建索引(xmljsoncvs格式的文件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等搜索,同时thisthat等也不能用于搜索)

 

5:更新索引

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

6:删除索引

Solrj的使用

http://wiki.apache.org/solr/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("<font color=\"red\">");

query.setHighlightSimplePost("</font>");

 

SolrDocumentList list = new SolrDocumentList();

SolrDocument document = null;

 

QueryResponse response=new QueryResponse();

try {

SolrDocumentList documents = response.getResults();

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

Map<String, Map<String, List<String>>> map = response.getHighlighting();

 

for(int i=0;i<documents.size();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中添加<maxFieldLength>1000</maxFieldLength>实现(默认是1万)。这里是分词数量,不是汉字或字母的个数

 

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

 

3:多条件查询

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

 

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

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

 

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

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

SolrQuery query = new SolrQuery(param);

   //返回的结果

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

query.setFields(str);

 

6Solr的分页

         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

 

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

SolrDocumentList list = response.getResults();

   Map<String, Map<String, List<String>>> 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");只对lucenesolr关键字进行高亮显示(solr不作为搜索条件也可以)

 

 

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

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

 

10schema文件,copyField配置

<!-- 感觉使用copyField的作用是。

                1:不需要在输入title:XXX,只需简单XXX即可查询

                2:将titlecontent中输入的内容全部放到text一个字段上进行,可以简化查询不需要过多的判断

                3:需要注意的是:source对应域的类型要和dest域对应的类型相兼容

    -->

    <copyField source="title" dest="complex"/>

    <copyField source="content" dest="complex"/>

 

 

 

 

 

11:自动补全

搜索时在titlecontent上进行搜索,所以自动补全时要在titlecontent上同时进行。但是自动补全只能在一个字段上进行(目前我知道这样),所以就创建一个新字段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<Term> list = resp.getTerms(searchField);

这种搜索存在的问题:

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

2 titlecontent无法配置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<FacetField> fss = qr.getFacetFields();

        FacetField ff = fss.get(0);

  return ff.getValues();

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

 

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

 

 

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

   1:修改tomcat-user.xml文件

<role rolename="tomcat"/>

  <role rolename="role1"/>

  <role rolename="manager"/>

  <role rolename="admin"/>

  <role rolename="manager-gui"/>

  <user username="tomcat" password="tomcat" roles="tomcat"/>

  <user username="both" password="tomcat" roles="tomcat,role1"/>

  <user username="role1" password="tomcat" roles="role1"/>

  <user username="zhchx" password="zhchx" roles="admin,manager,manager-gui"/>

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

<security-constraint>

       <web-resource-collection>

           <web-resource-name>solr</web-resource-name>

           <url-pattern>/*</url-pattern>

           <http-method>GET</http-method>

           <http-method>POST</http-method>

       </web-resource-collection>

       <auth-constraint>

           <description>This applies only to the "tomcat" security role</description>

           <role-name>admin</role-name>

       </auth-constraint>

   </security-constraint>

 

   <login-config>

       <auth-method>BASIC</auth-method>

   </login-config>

   <security-role>

       <role-name>admin</role-name>

   </security-role>

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.

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

 

 

 

分享到:
评论

相关推荐

    Solr入门教程-solr学习入门经典教程

    solr学习入门经典教程,赶紧学习吧,从solr的搭建讲起,中文分词器的配置

    solr学习入门教程

    solr 学习的入门教程,很实用的学习材料。适合初学者实用

    solr3.5配置及应用

    初学者学习solr时,可以借助此文档入门,学习solr

    Solr权威指南-上卷

    本书立足全球视野,综合Solr技术的发展和应用、从业人员的学习曲线,以及中英文资料的供给情况,给自己设定了一个极高的目标:力争在内容的全面性、系统性、深浅度和实战性上概括所有的同类书。从完成的结果上来看,...

    solr搜索引擎-课程文件培训

    本文档包括以下内容,通过下载该内容可以让你掌握solr学习的入门和适应基本开发。 1.学员操作手册-Solr搜索自动补全 2.solr实训教程.doc 3.积分商城基于Solr的搜索引擎优化.pdf 4.基于Solr的搜索引擎优化讲义.pdf 5....

    Solr权威指南-下卷

    本书立足全球视野,综合Solr技术的发展和应用、从业人员的学习曲线,以及中英文资料的供给情况,给自己设定了一个极高的目标:力争在内容的全面性、系统性、深浅度和实战性上概括所有的同类书。从完成的结果上来看,...

    Solr技术培训资料(基础知识+高级应用)。

    这是我整理的关于Solr的技术培训资料,它包含了关于Solr的基础知识和高级应用,例如分组、分词器、权重等问题,因为本人在学习solr时发现资源太少,所以整理了一些,当然由于本人技术不足,难免知识点不够全面,有...

    一个用Solr做企业应用内的搜索引擎的Springboot项目

    一个用Solr做企业应用内的搜索引擎的Springboot项目,适合正在入门solr和深入学习solr

    Solr官方文档

    solr官方文档,学习搜索引擎入门必备,看完绝对能成为初级搜索工程师.

    tomcat源码和solr基础代码.rar

    当我们初学tomcat的时候, 肯定先要学习怎样启动tomcat. 在tomcat的bin目录下有两个启动tomcat的文件, 一个是startup.bat, 它用于windows环境下启动tomcat; 另一个是startup.sh, 它用于linux环境下tomcat的启动. 两个...

    Mining Solr in Action最新英文版本pdf

    本英文书是针对Solr 4.7版本的实战性非常强的动手教程,无任何solr基础的人都会很容易从入门成长为高手,同时,该书穿插大量实例,覆盖solr4.7的方方面面,包括高级篇,如搜索性能优化,搜索结果缓存,索引分片,...

    solr-ref-guide-zh:Apache Solr 官方参考手册

    对原文档做翻译是为了方便快速入门和查阅,在尊重原文内容的基础上,适当进行了意译和词句调整,使得读起来更通顺易于理解,一些专业词组保留了英文,因为翻译过来反而更难理解,本文档难免有疏漏,欢迎大家提交...

    在Eclipse中运行Solr 基础知识

    Solr我还是个菜鸟,写这一些文章只是记录一下最近一段时间学习Solr的心得,望各位同仁不要见笑,还希望多多指点

    Solr3.6+IKAnalyzer3.2.8分词安装部署

    Solr是一个全文检索服务器,基于Lucene3.5开发的,我们可以在solr的基础上进行定制化的开发。新手学习记录了学习过程为后来者提供个参考吧。

    传智播客32期solr所用的数据库.txt

    这个是传智播客32期所用的数据库文件,

    Solr教学视频从入门到精通视频课程

    本课程适合有Lucene基础的同学学习1、Solr 是Apache下一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器2、Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能...

    java学习过程资源

    【学习阶段1】Java基础入门(1-25天) 【学习阶段1】WEB前端基础部分 【学习阶段2】Linux(26天 【学习阶段3】redis.(27天 【学习阶段4】基础练习.(28-34天) 【学习阶段5】hibreanate.(35-38天) 【学习阶段6】...

    全文检索Solr8.0-架构师速成记

    4.多种维度辅助学习,采用独立solr粉丝群辅助教学,学员问题会及时得到解决,程序员突破圈 打卡制度,督促学员学习 关注后再购买、 关注后再购买、 关注后再购买 课程能得到什么 1.快速学习到最新版本的全文检索技术...

    lucene学习

    Lucene的基础知识 1、案例分析:什么是全文检索,如何实现全文检索 2、Lucene实现全文检索的流程 a) 创建索引 b) 查询索引 3、配置开发环境 ...Lucene的高级查询、solr入门 solr在项目中的应用及电商搜索实现

Global site tag (gtag.js) - Google Analytics