Lucene和solr的一点理解

来源:互联网 发布:js遍历数组的方法 编辑:程序博客网 时间:2024/06/05 06:20

Lucene:全文检索引擎工具包,不能独立存在。

重要需要理解:索引域和文档域。

文档域可以理解为一条数据就为一个document,其中每一个字段就是一个field域

索引域:用于搜索,搜索程序将从索引域中搜索一个一个词,根据词找到对应的document。将Document中的Field的内容进行分词,将分好的词创建索引,索引=Field域名:词。

创建索引流程:

1、创建文档域,一个document可以添加多个TextField等其他类型的Field。Field有很多属性可以设置的。

2、分词:可以用标准的分词器,如StandardAnalyzer,IKAnalyzer(中文分词器,要配合IKAnalyzer.cfg.xml)。

3、创建IndexWriter并写到索引库,就是将document按照分词器去写到索引库(硬盘上的一个地址)

搜索索引流程:

1、创建QueryParser,指定field域名和分词器

2、创建query对象,如Query query = parser.parse("description:java AND c++");AND必须大写,类似于关键字

3、创建IndexSearcher,

File indexFile = new File("E:\\a\\b\\lucene\\");
Directory directory = FSDirectory.open(indexFile);
IndexReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);

4、通过searcher来搜索索引库searcher.search(query, 5);显示5条

5、遍历结果,ScoreDoc[] scoreDocs = topDocs.scoreDocs;

---------------------------------------------------------------------------------------------------

Solr:基于Lucene的全文搜索服务器,可以独立运行,把war包放到tomcat就可以运行了。

Solr解决了web应用直接与document交互,而是让solr服务器与document交互。

solr服务的配置很重要!

1、创建一个solrhome文件夹,可以从下载的zip中拷贝collection1到home下,其中collection1又被称为solrcore。一个home下可以有多个solrcore,每个solrcore实例提供单独的搜索和索引服务。

2、将contrib和dist拷贝到solrhome外面一层的文件夹

3、配置solrconfig.xml,该文件在collection1的conf下,主要关注lib标签,把目录改成现在的。

4、配置schema.xml,必须先定义你需要的field和fieldType。比如:

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

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

<!-- 目标域 -->
<field name="product_keywords" type="text_ik" indexed="true" stored="true" multiValued="true"/> 这个就是当你用product_keywords域时,里面的内容会在product_name和product_description两个实际的域中去找。
<copyField source="product_name" dest="product_keywords" />
<copyField source="product_description" dest="product_keywords" />

5、将solr.war放到tomcat下解压,在lib中添加额外的jar包(zip中example\lib\ext中),将example\resources中的log4j拷贝到WEB-INF的classes下。

6、修改web.xml,添加

<env-entry>
       <env-entry-name>solr/home</env-entry-name>
       <env-entry-value>E:\solr\solrhome</env-entry-value>
     <env-entry-type>java.lang.String</env-entry-type>
  </env-entry>

7、启动tomcat,localhost:8080/solr访问,提供一个可视化界面。

使用:

在数据库中建表,并填写数据,然后通过Dataimport插件生成索引文件

1、将dist下的solr-dataimporthandler-4.10.3.jar拷贝到contrib\dataimporthandler下,

修改solrconfig.xml文件,添加lib标签

<lib dir="${solr.install.dir:../..}/contrib/dataimporthandler/lib"regex=".*\.jar" />

2、在contrib下创建db文件夹,放mysql的连接jar。

修改solrconfig.xml文件,添加lib标签

<lib dir="${solr.install.dir:../..}/contrib/db/lib"regex=".*\.jar" />

3、创建data-config.xml,放到solrconfig.xml同目录

<?xml version="1.0" encoding="UTF-8" ?>  
<dataConfig>   
<dataSource type="JdbcDataSource"   
 driver="com.mysql.jdbc.Driver"   
 url="jdbc:mysql://192.168.48.131:3306/solr"   
 user="root"   
 password="root"/>   
<document>   
<entity name="product" query="SELECT name,description FROM products ">
<field column="name" name="product_name"/> //要与schema.xml中的field对应
<field column="description" name="product_description"/> 
</entity>   
</document>   
</dataConfig>

4、重启tomcat,在管理界面的dataimport下execute一把,就会生成索引文件。

--------------------------------------------------------------------------------------------------------

使用solr-solrj做开发,需要httpclient的支持,步骤还lucene差不多,就是api不一样,大致就是创建查询条件,HttpSolrServer去做query方法,然后封装结果。

下面是配置HttpSolrServer的bean。

<bean id="httpSolrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
<constructor-arg value="http://localhost:8080/solr/"></constructor-arg>
</bean>

一些复杂查询是常用的,比如

query.setQuery(queryString);和query.set("df", "product_name");连用就表示默认查询的域时product_name。其中df是固定的

另外比如query.addFilterQuery("product_price: [1  TO 100]");表示添加过滤条件,可追加。比如query.addFilterQuery("product_catalog_name:" + cataName);按类目过滤。

query.setSort("product_price", ORDER.desc);还能设置排序。

这个过程就类似于某网上商城搜索栏搜索,会把符合条件的都查出来。然后再选择价格以及类目进行过滤。

这里分享一个返回页数的好方法:

int pageCount = (int) (totalCount  / pageSize);
if ((totalCount % pageSize) > 0) {
pageCount++;
}

------------------------------可以通过solrj为solr服务器添加document(删改亦可),就像dataimport把数据库每一条数据弄成document放到solr一样。


原创粉丝点击