当前位置:   article > 正文

搜索系统框架(Solr)

搜索代理的封装框架有哪些

一.Lucene简介

Lucene的倒排索引,Solr是基于Lucene的一种实现,注意Lucene的一套使用CRUD,文档,字段,目录对象,索引写入器,索引写入器配置类,IK分词器,了解下分词器(扩展词典和停用词典),分页,得分(激励因子(可用于作弊)),高亮和排序。

二.Solr

1.solr介绍:

solr是独立的企业级搜索应用服务器,是基于jetty服务器的,对外提供类似于web-service接口的api,用户可通过http请求,向搜索引擎服务器提交一定格式的文件,生成索引,也可通过提出查找请求,获得返回结果,solr实际上是封装了lucene,提供了更强大的功能(集群分布式)

下载地址:http://www.apache.org/dyn/closer.cgi/lucene/solr/

下载后的目录结构:

contrib:使用solr功能,依赖相关的jar包

dist:存放solr自己jar包和solr.war

docs:文档目录

example:存放solr的案例

案例主要有两部分组成:

        a.WEB应用程序部分:

           主要负责对索引库中数据进行各种操作,并提供web'形式的管理界面,它可以通过solr内嵌的jetty服务器运行,也可部署在其他的web服务器中(如tomcat)中运行,对应位置目录在:solr-4.10.2\example\webapps\solr.war

        b.索引库部分:

           主要负责用来存放索引数据,好比lucene中的索引库文件,solr可以同时拥有多个索引库,对应位置在:solr-4.10.2\example\solr\collection1

2.solr的安装和运行:

    a.运行solr:

        方式一:可通过内置的jetty服务器来运行,在进入 solr-4.10.2\example目录下后,通过java -jar运行start.jar,通过jetty服务器访问端口8983访问服务即可,通过http方式即可访问:http://localhost:8983/solr

        方式二:部署tomcat服务器的方式:

        A).部署Web应用程序:将solr-4.10.2/example/webapps/solr.war解压后,复制到tomcat/webapps下

        B).

 

3.solr的基本使用:

        a.配置IK分词器

        b.使用管理界面,手动添加Documents

        c.使用管理界面的Query功能

 

 

4.Solr core配置

        a.solr core:一个core就是一个索引的服务,里面包含大量的功能(可通过handler实现),核心配置文件是schema.xml(是索引的配置,比如field等等)和solrconfig.xml(是core的搜索服务整体配置,比如索引库的位置等等)

        b.solr的目录结构:

        

一个solr.home可以有多个core,主要包含三个配置文件:

solr.xml:整个solr服务器下的整体配置,主要用来配置当前solr下有多少个core

solrconfig.xml:每个core下的配置,例如配置索引库的位置,jar,lucene版本等等

schema.xml:每个core下的具体索引的配置,例如配置的field分词器等等。

        c.solr.xml配置multicore:

           如果solr.home'下没有solr.xml文件,那么solr服务器会默认去找名称为collection1的core

           如果solr.xml没有任何配置,那么solr.home下的每一个文件就是一个core,在文件夹里要提高core.properties,配置name=core的名称,如果在solr.xml中配置了多个core,这样就不需要core.properties了

        d.schema.xml配置文件:

            A)通过<field>节点来定义建立索引查询数据的字段

            name代表数据字段名称

            type代表数据字段类型

            indexed代表是否被索引

            stored代表是否被存储

            multiValued代表是否有多个值,如果字段有多个值,要尽可能的设为true

            _version和_root节点建议保留,不要删除

            B)通过<fieldType>节点定义数据类型

               name代表节点定义的名称

               class指向org.apache.solr.analysis中定义的类型名称

               solr.TextField允许用户通过分析器来定制索引和查询,分析器包括一个分词器(tokenizer)和多个过滤器(filter)

               <analyzer>指定分词器

                

                也可自定义新字段:

                <field  name="yin" type="text_ik" indexed="true" stored="true" multiValued="true" />

                动态字段定义:只要以yin开头,都能使用这个字段

                <dynamicField name="yin*"  type="text_ik" indexed="true"  stored="true"  />

        e.solrconfig.xml:

            A).lib引入外部jar包

                可以将solr解压目录/contrib和dist复制solr.home下,修改lib的路径,引用到jar包中即可

                

                  B).索引相关配置:

                    <luceneMatchVersion> solr低层使用lucene版本

                    <dataDir> 配置索引文件位置,默认./data

                    <directoryFactory>配置索引的路径工厂

                    <indexConfig> 进行索引相关配置

                C).Request Dispatcher请求转发器的配置:  

                <requestHandler name="/select" class="solr.SearchHandler">

                <requestHandler name="/query" class="solr.SearchHandler">

                <requestHandler name="/get" class="solr.RealTimeGetHandler">

                <requestHandler name="/update" class="solr.UpdateRequestHandler">

                

                wt是通讯数据格式,indent是否缩进,df是默认搜索的字段 ,q是查询条件

                一般不会去改它,具体的设置还是通过外部的参数传入

5.SolrJ的基本功能:

        a.概念:

            solr的客户端代码和solr服务器之间的增删改查索引操作都是通过类似webservice接口API,所以在操作时,只要遵循一定的接口规范即可。

        准备:导入solrJ.jar包到项目中,运行solr服务器

        b.添加.修改索引(使用相同的api)

            传统方式:      

  1. /**
  2. * 创建索引(传统方式)
  3. *
  4. * @throws IOException
  5. * @throws SolrServerException
  6. */
  7. @Test
  8. public void createIndex1() throws SolrServerException, IOException {
  9. // 使用HttpSolr服务端(HttpSolrServer) 创建solr服务器端对象
  10. HttpSolrServer solrServer = new HttpSolrServer(
  11. "http://localhost:8080/solr/core1");
  12. // 使用solr输入文档(SolrInputDocument) 创建文档对象
  13. SolrInputDocument document = new SolrInputDocument();
  14. // 添加字段到文档对象
  15. document.addField("id", "3");
  16. document.addField("title", "这是来自solrj客户端的第一个title");
  17. document.addField("content", "这是来自solrj客户端的第一个content");
  18. //添加文档到solr服务器对象
  19. solrServer.add(document);
  20. // 提交
  21. solrServer.commit();
  22. }

          bean注解方式:

          创建实体bean,对实体bean添加注解@Field,直接传递bean

  1. import org.apache.solr.client.solrj.beans.Field;
  2. /**
  3. * @author Administrator 文章实体Bean
  4. */
  5. public class Article {
  6. @Field
  7. private String id;
  8. @Field
  9. private String title;
  10. @Field
  11. private String content;
  12. public String getId() {
  13. return id;
  14. }
  15. public void setId(String id) {
  16. this.id = id;
  17. }
  18. public String getTitle() {
  19. return title;
  20. }
  21. public void setTitle(String title) {
  22. this.title = title;
  23. }
  24. public String getContent() {
  25. return content;
  26. }
  27. public void setContent(String content) {
  28. this.content = content;
  29. }
  30. }

  通过bean创建索引:

  1. /**
  2. * 创建索引(Bean注解方式)
  3. * @throws SolrServerException
  4. * @throws IOException
  5. */
  6. @Test
  7. public void createIndex2() throws IOException, SolrServerException {
  8. // 使用HttpSolr服务端(HttpSolrServer) 创建solr服务器端对象
  9. HttpSolrServer solrServer = new HttpSolrServer(
  10. "http://localhost:8080/solr/core1");
  11. for (int i = 0; i < 30; i++) {
  12. //创建bean
  13. Article article = new Article();
  14. //添加值
  15. article.setId(""+i);
  16. article.setTitle("这是来自solrj客户端的第一个title"+i);
  17. article.setContent("这是来自solrj客户端的第一个content"+i);
  18. //添加实体对象到solr服务器对象中
  19. solrServer.addBean(article);
  20. //提交
  21. }
  22. solrServer.commit();
  23. }

        c.删除索引:

            根据id删除:    

  1. /**
  2. * 删除索引(根据id)
  3. * @throws IOException
  4. * @throws SolrServerException
  5. */
  6. @Test
  7. public void deleteIndex1() throws SolrServerException, IOException {
  8. // 使用HttpSolr服务端(HttpSolrServer) 创建solr服务器端对象
  9. HttpSolrServer solrServer = new HttpSolrServer(
  10. "http://localhost:8080/solr/core1");
  11. //删除
  12. solrServer.deleteById("2");
  13. //提交
  14. solrServer.commit();
  15. }

        Query表达式方式: 

  1. /**
  2. * 删除索引(根据Query表达式删除)
  3. * @throws IOException
  4. * @throws SolrServerException
  5. */
  6. @Test
  7. public void deleteIndex2() throws SolrServerException, IOException {
  8. // 使用HttpSolr服务端(HttpSolrServer) 创建solr服务器端对象
  9. HttpSolrServer solrServer = new HttpSolrServer(
  10. "http://localhost:8080/solr/core1");
  11. // 删除
  12. solrServer.deleteByQuery("id:1*");
  13. // 提交
  14. solrServer.commit();
  15. }

        d.查询索引:

            传统方式:           

  1. /**
  2. * 查询索引(传统方式)
  3. * @throws SolrServerException
  4. */
  5. @Test
  6. public void queryIndex1() throws SolrServerException {
  7. // 使用HttpSolr服务端(HttpSolrServer) 创建solr服务器端对象
  8. HttpSolrServer solrServer = new HttpSolrServer(
  9. "http://localhost:8080/solr/core1");
  10. // 创建solr查询对象(solrquery)并且载入要查询的内容
  11. SolrQuery solrQuery = new SolrQuery("title:这是");
  12. // 添加返回结果的列
  13. solrQuery.addField("id");
  14. solrQuery.addField("title");
  15. // 设置查询结果返回的行数
  16. solrQuery.setRows(20);
  17. // 设置排序方式
  18. solrQuery.setSort("id", ORDER.desc);
  19. // 开始查询,返回查询响应对象(QueryResponse)
  20. QueryResponse response = solrServer.query(solrQuery);
  21. // 通过查询响应对象(QueryResponse)获得结果
  22. SolrDocumentList results = response.getResults();
  23. // 对结果进行遍历,获得solr文档对象,并打印出结果
  24. for (SolrDocument solrDocument : results) {
  25. System.out.println(solrDocument.getFieldValue("id"));
  26. System.out.println(solrDocument.getFieldValue("title"));
  27. //List titles = (List) solrDocument.getFieldValue("title");
  28. //System.out.println(titles.get(0));
  29. System.out.println(solrDocument.getFieldValue("content"));
  30. }
  31. }

        bean注解方式:       

  1. /**
  2. * 查询结果(返回bean形式)
  3. * @throws SolrServerException
  4. */
  5. @Test
  6. public void queryIndex2() throws SolrServerException {
  7. // 使用HttpSolr服务端(HttpSolrServer) 创建solr服务器端对象
  8. HttpSolrServer solrServer = new HttpSolrServer(
  9. "http://localhost:8080/solr/core1");
  10. // 创建solr查询对象(solrquery)并且载入要查询的内容
  11. SolrQuery solrQuery = new SolrQuery("title:这是");
  12. // 设置返回结果的列
  13. solrQuery.addField("id");
  14. solrQuery.addField("title");
  15. // 设置查询结果返回的行数
  16. solrQuery.setRows(20);
  17. // 开始查询,返回查询响应对象(QueryResponse)
  18. QueryResponse response = solrServer.query(solrQuery);
  19. // 通过查询响应对象(QueryResponse)获得结果(Bean返回形式)
  20. List<Article> beans = response.getBeans(Article.class);
  21. // 对结果进行遍历,并打印出结果
  22. for (Article article : beans) {
  23. System.out.println(article.getId());
  24. System.out.println(article.getTitle());
  25. System.out.println(article.getContent());
  26. }
  27. }

注意:如果配置schema.xml中配置指定是field的multiValued为true,其对应的实体Bean应为List,不然会出错,或者将multiValued值改为false即可。

6. SolrJ高级功能:

    多条件查询:

  1. //new SolrQuery("查询表达式")
  2. SolrQuery solrQuery = new SolrQuery("title:3 or id:5");

查询结果高亮处理:      

  1. /**
  2. * 查询结果(高亮模式)
  3. *
  4. * @throws SolrServerException
  5. */
  6. @Test
  7. public void queryIndex5() throws SolrServerException {
  8. // 使用HttpSolr服务端(HttpSolrServer) 创建solr服务器端对象
  9. HttpSolrServer solrServer = new HttpSolrServer(
  10. "http://localhost:8080/solr/core1");
  11. // 创建solr查询对象(solrquery)并且载入要查询的内容
  12. // new SolrQuery("查询表达式")
  13. SolrQuery solrQuery = new SolrQuery("title:这是");
  14. // 设置要查询的列
  15. solrQuery.addField("id");
  16. solrQuery.addField("title");
  17. solrQuery.addField("content");
  18. // 设置查询结果返回的行数
  19. solrQuery.setRows(20);
  20. /*************************高亮设置及查询********************************/
  21. // 是否高亮
  22. solrQuery.setHighlight(true);
  23. // 摘要长度
  24. solrQuery.setHighlightFragsize(50);
  25. // 设置前后缀
  26. solrQuery.setHighlightSimplePre("<font color='red'>");
  27. solrQuery.setHighlightSimplePost("</font>");
  28. // 添加高亮的field
  29. solrQuery.addHighlightField("title");
  30. // 开始查询,返回查询响应对象(QueryResponse)
  31. QueryResponse response = solrServer.query(solrQuery);
  32. System.out.println(response.getResponse());
  33. // 处理结果集 第一个Map的键是文档的ID,第二个Map的键是高亮显示的字段名
  34. Map<String, Map<String, List<String>>> highlighting = response
  35. .getHighlighting();
  36. for (Map.Entry<String, Map<String, List<String>>> entry : highlighting.entrySet()) {
  37. System.out.println("key:"+entry.getKey());
  38. System.out.println("value:" + entry.getValue());
  39. }
  40. /***********************************************************/
  41. }

 

7.solr数据导入并索引:

    solr导入数据库中的数据

    a.建立数据库,

    b.配置服务器core/conf/solrconfig.xml添加导入handler

            A).将/dist目录复制到solr core所在目录

            B).在solrconfig.xml中添加<lib dir="../dist/" regex="solr-dataimporthandler-\d.*\.jar" />

                注意相对路径一定要正确

            C).core/conf中新建配置文件db-data-config.xml并写入内容:     

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <dataConfig>
  3. <dataSource type="JdbcDataSource"
  4. driver="com.mysql.jdbc.Driver"
  5. url="jdbc:mysql://localhost:3306/solr"
  6. user="root"
  7. password="123456"/>
  8. <document>
  9. <entity name="id" query="select id,title,content from article"></entity>
  10. </document>
  11. </dataConfig>

        D)在solrconfig.xml中继续添加

  1. <requestHandler name="/import" class="org.apache.solr.handler.dataimport.DataImportHandler">
  2. <lst name="defaults">
  3. <str name="config">db-data-config.xml</str>
  4. </lst>
  5. </requestHandler>

        E).将mysql驱动包 复制 tomcat/webapps/solr/WEB-INF/lib下

        F)启动服务,直接访问http://localhost:8080/solr/core1/import?command=full-import即可

 

 

到此solr学习完成啦。。。。。。。。。。。。。。。。

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/3110937/blog/888308

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/862303
推荐阅读
相关标签
  

闽ICP备14008679号