Solr学习笔记之添加文档

Posted Java小学生的成长日志

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Solr学习笔记之添加文档相关的知识,希望对你有一定的参考价值。

通过本文,你将学到:

  1. 发送XML或JSON格式的文档到Solr

  2. 使用SolrJ客户端添加documents

发送XML或JSON格式的文档到Solr

准备工作

在添加文档到Solr之前,我们必须修改Solr的schema.xml文件,添加一些我们自己的字段。该文件位于:solr core 目录下的conf目录。在本文中,可能是:collection1\conf\  目录下。然后添加如下内容到该文件


[html] view plain copy

  1. <field name="watchName" type="string" indexed="true" stored="true"/>  

  2. <field name="model" type="string" indexed="true" stored="true"/>  

  3. <field name="catch_all" type="text_en" indexed="true" stored="false" multiValued="true"/>  

  4. <copyField source="watchName" dest="catch_all" />  

  5. <copyField source="model" dest="catch_all" />  

  6. <copyField source="description" dest="catch_all" />  



添加XML格式的documents到Solr

在本节中,我们将使用发送文档到Solr的索引中,并展示下我们在 http://blog.csdn.net/yanan_seachange/article/details/43303311 一文中,所提到的复制字段的神奇之处。

首先,我们定义如下格式的XML:


[html] view plain copy

  1. <?xml version="1.0" encoding="GB18030"?>  

  2. <add><!-- 告诉Solr,我们将要添加一个新的文档到索引 -->  

  3.     <doc><!-- 你可以使用add节点一次性添加更多的文档到Solr,每个文档都应被包含在<add>节点中 -->  

  4.         <field name="id">1</field>  

  5.         <field name="watchName">日志型 II</field>  

  6.         <field name="model">116300</field>  

  7.         <field name="description">该腕表于2009年面世,在其增大的表壳内,蕴含了劳力士最新的技术</field>  

  8.     </doc>  

  9.     <doc>  

  10.         <field name="id">2</field>  

  11.         <field name="watchName">黑水鬼</field>  

  12.         <field name="model">116610ln</field>  

  13.         <field name="description">它是潜水腕表中的出众典范。自1953年诞生以来,不仅依靠完美表现征服深海世界,魅力更遍及陆地。置身海洋,该腕表是专业潜水员的最佳陪伴;探索陆地,它亦是精湛与勇往直前的完美体现,因此备受深具远见卓识的腕表爱好者的青睐。</field>  

  14.     </doc>  

  15. </add>  


然后,启动Solr,为了简便起见,我们将上述文档放到了example\exampledocs这个目录下,之后在命令行中输入:



[plain] view plain copy

  1. java -jar post.jar watches.xml  


随后我们可以看到类似下面的输出:




在浏览器中输入:http://localhost:8983/solr 选择collection1之后,点击查询,可以看到类似下图的页面:


下面展示下catch_all 字段:



Solr学习笔记之添加文档

请注意,post.jar。它是我们学习Solr的一个好工具,在命令,你可以输入 java -jar post.jar -h 来看更多的帮助信息,其中就包括如何添加json格式的文档到Solr索引。


添加json格式的document到Solr索引

我们在\example\exampledocs目录下定义了如下的json文件:


[plain] view plain copy

  1. [  

  2.     {  

  3.         "id": "1",  

  4.         "watchName": "星期日历型",  

  5.         "model": "118238A-83208",  

  6.         "description": "自1956年问世以来,星期日历型便是显赫人士的拥戴之选。它是全球首款在表面上既有日历窗又能显示有全写星期的腕表。作为尊贵腕表的典范,星期日历型只使用金及铂金等贵金属铸造。"  

  7.     }  

  8. ]  


请注意,你可能需要对json文件中,汉字进行unicode处理。
并使用post.jar的相关命令添加该文件到Solr索引,整个过程如下:



下面的输出,验证了上面的添加方式:


使用SolrJ客户端添加documents

SolrJ是一个以Java为基础的客户端库,它提供了从一个Java应用中,Solr项目与你的Solr服务器交互.在本节中,

我们将会实现一个简单的SolrJ客户端程序来发送文档使用Java。

SolrJ的maven配置:


[html] view plain copy

  1. <dependency>  

  2.             <groupId>org.apache.solr</groupId>  

  3.             <artifactId>solr-solrj</artifactId>  

  4.             <version>4.7.1</version>  

  5.         </dependency>  

  6.         <dependency>  

  7.             <groupId>org.slf4j</groupId>  

  8.             <artifactId>slf4j-api</artifactId>  

  9.             <version>1.7.5</version>  

  10.         </dependency>  

  11.         <dependency>  

  12.             <groupId>commons-logging</groupId>  

  13.             <artifactId>commons-logging</artifactId>  

  14.             <version>1.1.1</version>  

  15.         </dependency>  


[java] view plain copy

  1. package com.lemon.solrj.test;  

  2.   

  3. import java.io.IOException;  

  4. import java.io.PrintStream;  

  5. import java.util.ArrayList;  

  6. import java.util.Collections;  

  7. import java.util.List;  

  8. import org.apache.solr.client.solrj.SolrQuery;  

  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. public class ExampleSolrJClient {  

  17.     private static final String serverUrl= "http://localhost:8983/solr/collection1";  

  18.     private static SolrServer solr;  

  19.     static{  

  20.         solr= new HttpSolrServer(serverUrl);  

  21.     }  

  22.     public static void main(String[] args) throws Exception {  

  23.         // addDocument();  

  24.   

  25.         for (SolrDocument next : simpleSolrQuery(solr, "catch_all:鬼"10)) {  

  26.             prettyPrint(System.out, next);  

  27.         }  

  28.     }  

  29.   

  30.     static void addDocument(){  

  31.         try {  

  32.             SolrInputDocument datejustII = new SolrInputDocument();  

  33.             datejustII.setField("id""1");  

  34.             datejustII.setField("watchName""日志型 II");  

  35.             datejustII.setField("model""116300");  

  36.             datejustII.setField("description""该腕表于2009年面世,在其增大的表壳内,蕴含了劳力士最新的技术");  

  37.             solr.add(datejustII);  

  38.   

  39.             SolrInputDocument blackSubmariner = new SolrInputDocument();  

  40.             blackSubmariner.setField("id""2");  

  41.             blackSubmariner.setField("watchName""黑水鬼");  

  42.             blackSubmariner.setField("model""116610ln");  

  43.             blackSubmariner.setField("description""它是潜水腕表中的出众典范。"  

  44.                     + "自1953年诞生以来,不仅依靠完美表现征服深海世界,魅力更遍及陆地。置身海洋,该腕表是专业潜水员的最佳陪伴;"+  

  45.             "探索陆地,它亦是精湛与勇往直前的完美体现,因此备受深具远见卓识的腕表爱好者的青睐。");  

  46.             solr.add(blackSubmariner);  

  47.   

  48.             solr.commit(truetrue);  

  49.         } catch (SolrServerException e) {  

  50.             e.printStackTrace();  

  51.         } catch (IOException e) {  

  52.             e.printStackTrace();  

  53.         }  

  54.     }  

  55.   

  56.     static SolrDocumentList simpleSolrQuery(SolrServer solr,  

  57.             String query, int rows) throws SolrServerException {  

  58.         SolrQuery solrQuery = new SolrQuery(query);  

  59.         solrQuery.setRows(rows);  

  60.         QueryResponse resp = solr.query(solrQuery);  

  61.         SolrDocumentList hits = resp.getResults();  

  62.         return hits;  

  63.     }  

  64.     static void prettyPrint(PrintStream out, SolrDocument doc) {  

  65.         List<String> sortedFieldNames =  

  66.             new ArrayList<String>(doc.getFieldNames());  

  67.         Collections.sort(sortedFieldNames);  

  68.         out.println();  

  69.         for (String field : sortedFieldNames) {  

  70.             out.println(String.format("\t%s: %s",  

  71.                     field, doc.getFieldValue(field)));  

  72.         }  

  73.         out.println();  

  74.     }  

  75. }  


关于上述代码的输出,这里就不再赘述了。


以上是关于Solr学习笔记之添加文档的主要内容,如果未能解决你的问题,请参考以下文章

Solr-5.3.0学习笔记Solr Admin UI

JavaScript学习笔记7 之DOM文档对象模型

Solr学习笔记——查询

Spring IOC官方文档学习笔记之基于注解的容器配置

Solr学习笔记 - 目录结构

Solr-5.3.0学习笔记Manage Core