solr初次使用

Posted flybluesky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了solr初次使用相关的知识,希望对你有一定的参考价值。

什么是solr?

Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。


solr整合Tomcat步骤

第一步:安装tomcat。D: empapache-tomcat-7.0.53

第二步:把solr的war包复制到tomcat 的webapp目录下。

把solr-4.10.3distsolr-4.10.3.war复制到D: empapache-tomcat-7.0.53webapps下。

改名为solr.war
第三步:solr.war解压。使用压缩工具解压或者启动tomcat自动解压。解压之后删除solr.war

第四步:把solr-4.10.3examplelibext目录下的所有的jar包添加到solr工程中

第五步:配置solrHome和solrCore。

1)创建一个solrhome(存放solr所有配置文件的一个文件夹)。solr-4.10.3examplesolr目录就是一个标准的solrhome。

2)把solr-4.10.3examplesolr文件夹复制到D: emp108路径下,改名为solrhome,改名不是必须

3)在solrhome下有一个文件夹叫做collection1这就是一个solrcore。就是一个solr的实例。一个solrcore相当于mysql中一个数据库。Solrcore之间是相互隔离

第六步:告诉solr服务器配置文件也就是solrHome的位置。修改web.xml使用jndi的方式告诉solr服务器。

    Solr/home名称必须是固定的。

第七步:启动tomcat

第八步:访问http://localhost:8080/solr/


 

技术分享图片

技术分享图片


 

copyField(复制域)

  copyField复制域,可以将多个Field复制到一个Field中,以便进行统一的检索

  根据关键字只搜索text域的内容就相当于搜索title和content,将title和content复制到text中,如下:

<copyField source="title" desc="text">
<copyField source="content" desc="text">

dynamicField(动态字段)

  动态字段就是不用指定具体的名称,只要定义字段名称的规则,

    例如定义一个 dynamicField,name 为*_i,定义它的type为text,那么在使用这个字段的时候,任何以_i结尾的字段都被认为是符合这个定义的

    例如:name_i,gender_i,school_i等。

安装中文分词器

第一步:把IKAnalyzer2012FF_u1.jar添加到solr/WEB-INF/lib目录下。

第二步:复制IKAnalyzer的配置文件和自定义词典和停用词词典到solr的classpath下。

第三步:在schema.xml中添加一个自定义的fieldType,使用中文分析器。

<!-- IKAnalyzer-->
    <fieldType name="text_ik" class="solr.TextField">
      <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
    </fieldType>

第四步:定义field,指定field的type属性为text_ik

<!--IKAnalyzer Field-->
   <field name="title_ik" type="text_ik" indexed="true" stored="true" />
   <field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true"/>

第五步:重启tomcat

使用Analyse测试


 

使用数据库批量导入数据(MySQL)

第一步:把dataimport插件依赖的jar包添加到solrcore(collection1lib)中

  solr-4.10.3dist

     solr-dataimporthandler-4.10.3.jar

     solr-dataimporthandler-extras-4.10.3.jar

  还需要mysql的数据库驱动

 

第二步:配置solrconfig.xml文件,添加一个requestHandler。

<requestHandler name="/dataimport" 
class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
      <str name="config">data-config.xml</str>
     </lst>
  </requestHandler> 

第三步:创建一个data-config.xml,保存到collection1conf目录下

<?xml version="1.0" encoding="UTF-8" ?>  
<dataConfig>   
<dataSource type="JdbcDataSource"   
          driver="com.mysql.jdbc.Driver"   
          url="jdbc:mysql://localhost:3306/lucene"   
          user="root"   
          password="root"/>   
<document>   
    <entity name="product" query="SELECT pid,name,catalog_name,price,description,picture FROM products ">
         <field column="pid" name="id"/> 
         <field column="name" name="product_name"/> 
         <field column="catalog_name" name="product_catalog_name"/> 
         <field column="price" name="product_price"/> 
         <field column="description" name="product_description"/> 
         <field column="picture" name="product_picture"/> 
    </entity>   
</document>   

</dataConfig>

第四步:添加业务Field 在schema.xml添加

<!--product-->
   <field name="product_name" type="text_ik" indexed="true" stored="true"/>
   <field name="product_price"  type="float" indexed="true" stored="true"/>
   <field name="product_description" type="text_ik" indexed="true" stored="false" />
   <field name="product_picture" type="string" indexed="false" stored="true" />
   <field name="product_catalog_name" type="string" indexed="true" stored="true" />

   <field name="product_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
   <copyField source="product_name" dest="product_keywords"/>
   <copyField source="product_description" dest="product_keywords"/>

第五步:重启tomcat


 

操作语句

删除  

1) 删除制定ID的索引

<delete>
         <id>8</id>
</delete>
<commit/>

2) 删除查询到的索引数据

<delete>
      <query>product_catalog_name:幽默杂货</query>
</delete>

3) 删除所有索引数据

 <delete>
     <query>*:*</query>
</delete>

查询索引

  查询所有:

      *:*

  范围查询:

    域名:[值 TO 值]、域名:{值 TO 值]、域名:[值 TO 值}、域名{值 TO 值}

    也可以使用“*”表示无限,例如:

    20以上:product_price:[20 TO *]

    20以下:product_price:[* TO 20]

  排序:

     <field name>+<desc|asc>[,<field name>+<desc|asc>]

  分页:

    从0开始、显示条数

  fl - 指定返回那些字段内容,用逗号或空格分隔多个

  df-指定一个默认搜索Field

  wt - (writer type)指定输出格式,

    可以有 xml, json, php, phps, 后面 solr 1.3增加的,要用通知我们,因为默认没有打开。

  hl 是否高亮 ,设置高亮Field,设置格式前缀和后缀。


 

使用SolrJ管理索引库

jar包:

  solr-4.10.3distsolrj-lib

      下全部jar包共8个

  solr-4.10.3dist

      solr-solrj-4.10.3.jar

  其他

     commons-logging-1.2.jar

技术分享图片
  1 package cn.solr.demo;
  2 
  3 
  4 import java.util.List;
  5 import java.util.Map;
  6 
  7 import org.apache.solr.client.solrj.SolrQuery;
  8 import org.apache.solr.client.solrj.SolrQuery.ORDER;
  9 import org.apache.solr.client.solrj.SolrServer;
 10 import org.apache.solr.client.solrj.SolrServerException;
 11 import org.apache.solr.client.solrj.impl.HttpSolrServer;
 12 import org.apache.solr.client.solrj.response.QueryResponse;
 13 import org.apache.solr.common.SolrDocument;
 14 import org.apache.solr.common.SolrDocumentList;
 15 import org.apache.solr.common.SolrInputDocument;
 16 import org.junit.Test;
 17 
 18 /**
 19  * solr 单机版测试
 20  * @author xiaou
 21  *
 22  */
 23 public class SolrDemo {
 24     @Test
 25     //添加索引
 26     public void testAdd() throws Exception {
 27         //1.连接solr服务器
 28         SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/myCore");
 29         SolrInputDocument doc = new SolrInputDocument();
 30         doc.addField("id", "c0001");
 31         doc.addField("product_catalog_name", "爱你");
 32         solrServer.add(doc);
 33         solrServer.commit();
 34     }
 35     
 36     @Test
 37     //删除索引
 38     public void testDelete() throws Exception {
 39         SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/myCore");
 40         solrServer.deleteById("c0001");
 41         solrServer.commit();
 42     }
 43     
 44     @Test
 45     //修改索引
 46     //通过先删后增的方式进行修改
 47     public void testUpdate() throws Exception {
 48         //1.连接solr服务器
 49         SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/myCore");
 50         SolrInputDocument doc = new SolrInputDocument();
 51         doc.addField("id", "c0001");
 52         doc.addField("product_catalog_name", "爱你咯");
 53         solrServer.add(doc);
 54         solrServer.commit();
 55     }
 56     
 57     @Test
 58     //简单查询
 59     public void queryIndex() throws Exception {
 60         //1.连接solr服务器
 61         SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/myCore");
 62         //2.创建查询对象
 63         SolrQuery query = new SolrQuery();
 64         //3.设置查询条件
 65         query.setQuery("*:*");
 66         //4.执行查询
 67         QueryResponse response = solrServer.query(query);
 68         //5.取回结果集
 69         SolrDocumentList results = response.getResults();
 70         System.out.println("共有"+results.getNumFound()+"条记录");
 71         System.out.println("-------------------------------------------------");
 72         //6.遍历结果集
 73         for (SolrDocument solrDocument : results) {
 74             System.out.println("商品id "+solrDocument.get("id"));
 75             System.out.println("商品名称 "+solrDocument.get("product_name"));
 76             System.out.println("商品价格 "+solrDocument.get("product_price"));
 77             System.out.println("商品分类 "+solrDocument.get("product_catalog_name"));
 78             System.out.println("-----------------------------------------------------------");
 79         }
 80     }
 81     @Test
 82     //复杂查询
 83     //查询、过滤、分页、排序、高亮
 84     public void queryIndex2() throws Exception {
 85         SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/myCore");
 86         SolrQuery query = new SolrQuery();
 87         //设置默认查询域
 88         query.set("df", "product_name");
 89         //设置查询条件
 90         query.setQuery("家天下");
 91         //设置过滤条件
 92         query.set("fq", "product_catalog_name:幽默杂货");
 93         //设置排序
 94         query.setSort("product_price", ORDER.desc);
 95         //分页
 96         query.setStart(0);
 97         query.setRows(20);
 98         //结果中要包含的域
 99         query.setFields("id","product_name","product_price","product_catalog_name");
100         //打开高亮显示
101         query.setHighlight(true);
102         //设置高亮显示的域
103         query.addHighlightField("product_name");
104         //设置高亮的前缀和后缀
105         query.setHighlightSimplePre("<span style=‘color:red‘>");
106         query.setHighlightSimplePost("</span>");
107         QueryResponse queryResponse = solrServer.query(query);
108         SolrDocumentList documentList = queryResponse.getResults();
109         System.out.println("共有"+documentList.getNumFound()+"条记录");
110         for (SolrDocument solrDocument : documentList) {
111             System.out.println("商品id "+solrDocument.get("id"));
112             System.out.println("商品名称 "+solrDocument.get("product_name"));
113             System.out.println("商品价格 "+solrDocument.get("product_price"));
114             System.out.println("商品分类 "+solrDocument.get("product_catalog_name"));
115             Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
116             List<String> list = highlighting.get(solrDocument.get("id")).get("product_name");
117             if(list!=null) {
118                 System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++");
119                 System.out.println(list);
120             }
121             System.out.println("-----------------------------------------------------------");
122         }
123     }
124 }
demo

以上是关于solr初次使用的主要内容,如果未能解决你的问题,请参考以下文章

solr分布式索引实战分片配置读取:工具类configUtil.java,读取配置代码片段,配置实例

Solr 高亮是不是还可以指示返回的片段在原始字段中的位置或偏移量?

在 solr 3.4 中放置突出显示片段配置的位置

git项目初次push提示error: failed to push some refs to https://gitee.com/xxxx/gittest.git’解决方案 --九五小庞(代码片段

Solr Highlighting:如何为同一字段请求多个片段长度?

如何使用SOLRJ java客户端从SOLR获取列名(字段)?