`

solr6.6搜索环境搭建、IK中文分词、同义词、拼音、solrj的使用

阅读更多
 
 
2017-06-20 Apache官网发布了solr6.6版本下载地址
下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/solr/6.6.0/
solr6.6搜索环境搭建、IK中文分词同义词拼音solrj的使用

 

部署环境:Tomcat8

solr版本:6.6

jdk:1.8

solr配置:

解压solr,将目录\solr-6.6.0\server\solr-webapp下了webapp文件夹拷贝至
Tomcat的webapp目录下.改名为solr
将olr-6.6.0/server/lib/ext中所有jar包拷贝至\webapps\solr\WEB-INF\lib下,
将\solr-6.6.0\dist\solrj-lib下的noggit-0.6.jar拷贝至\webapps\solr\WEB-INF\lib下,
将olr-6.6.0/server/lib/中所有metrics-开头jar包拷贝至\webapps\solr\WEB-INF
\lib下,
WEB-INF下件新建classes文件夹,然后将\solr-6.6.0\server\resources中
log4j.properties拷贝至classes下.
 

 
将\solr-6.6.0\server目录下solr文件拷贝至任意位置.(我这里是G:\solrhome)改名
为solrhome.作为索引存放位置

 

在solrhome目录下,新建collection1文件夹,并将 /solr-6.6.0/server/solr/configsets/basic_configs
中conf文件夹复制到新建的collection1文件夹中.在collection1目录下新建data文件夹.
collection1中创建文件core.properties,写入内容
name=collection1
config=solrconfig.xml
schema=schema.xml
dataDir=data

 

 

回到Tomcat目录下,打开\webapps\solr\WEB-INF\web.xml文件.打开被注释的<env-entry>,
修改路径为solrhome的路径

 

    <env-entry>
       <env-entry-name>solr/home</env-entry-name>
       <env-entry-value>G:\solrhome</env-entry-value>
       <env-entry-type>java.lang.String</env-entry-type>
    </env-entry>
 将底部<security-constraint>注释掉;


 

访问 localhost:8080/solr/index.html



 
接下来就是配置IK中文分析器:

solr本身带有中文分词器,不过其不支持自己添加词汇,选用IK分词器,不过IK在2012年已经停止更新了,

但是这里附件提供了最新的IK支持.ikanalyzer-solr6.6.zip

ik-analyzer-solr5-5.x.jarsolr-analyzer-ik-5.1.0.jar复制到\solr\WEB-INF\lib下,将IKAnalyzer.cfg.xml、ext.dic、stopword.dic



 

三个文件复制到\solr\WEB-INF\classes下ext.dic文件里为自定义的扩展词汇,

stopword为自定义的停用词

接下来开始定义fieldType和field将下面代码复制到solrhome的olrhome\collection1\conf\目录下
managed-schema文件里.这里配置包含了后面的近义词,(近义词后面说)

 

<fieldType name="text_ik" class="solr.TextField">
    <analyzer type="index">
	<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" isMaxWordLength="false" useSmart="false" />
	<filter class="solr.LowerCaseFilterFactory" />
    </analyzer>
	<analyzer type="query">
		<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"
 isMaxWordLength="false" useSmart="false" />
		<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt"
 ignoreCase="true" expand="true" />
		<filter class="solr.LowerCaseFilterFactory" />
	</analyzer>
</fieldType>

 

 这个时候就可以测试一下是否成功了.

 

 
 已经成功分词了..

针对企业级应用就要配置自定义的Field.此处不做详细描述.在managed-schema文件中添加就是.

这里提供一个示例,一般情况是根据实际情况分配.此示例仅供参考.

注意:需要对其中文分词提供搜索type属性必须为前面配置的IK名一样.

唯一索引id在solr中就叫ID并且是必须字段,所以不需单独配置

 

<!--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"/>

 用product_keywords作为默认的搜索域,搜索时联合product_name和product_description进行搜索

 

 
利用solr提供的客户端开始关联数据库.实现批量数据的导入.
<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文件,我这里用的mysql,field为配置field的映射,
column为数据库字段名.name为前面自定义field的name
注意:根据实际情况配置
<?xml version="1.0" encoding="UTF-8" ?>  
<dataConfig>   
<dataSource type="JdbcDataSource"   
		  driver="com.mysql.jdbc.Driver"   
		  url="jdbc:mysql://localhost:3306/solrDemo"   
		  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>
 将solr-6.6.0\dist目录下的solr-dataimporthandler-6.6.0.jarsolr-dataimporthandler-extras-6.6.0.jar复制到solr/
WEB-INF/lib下,在solrhome\collection1\conf\solrconfig.mxl配置<lib dir=''solr的lib路径>
原先为相对路径在solr6.6文件里寻找,这样方便管理,并且不会因为路径更换拾取包的依赖.


 
 然后打开客户端,点击Execute,如下:
注意:如果不勾选 Auto-Refresh Status 不会提示是否全部建立索引成功,点击右边Refresh 刷新
entity是data-config.xml里面的entity

 
 
接下来就可以点击 Query 进行查询了.这里不做演示.

注意:因为中文分词缘故,已经被分为词语储存,进行单个字查询的时候会出现查不到的结果.

解决方案一(不推荐):将所有单个字作为扩展词,缺点:分的过于细,会影响搜索结果.出现不愿出现的结果

解决方案二:使用通配符 *.

近义词配置:前面配置IK已经配置了近义词了,前面配置的是在查询时

会使用近义词查询,并没有配置建立索引时建立近义词索引.那么现在就开始

添加近义词了.在managed-schema同级目录下的synonyms.txt里,

 如图,搜索房产,地产,不动产任意一个,则三个结果都会出现.

 

拼音配置:

方案一:直接使用solr分词实现.就在原先IK配置上加上

 

<filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLenght="2" />
<filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="1" maxGram="20" />

 

具体属性意义不做讲解.不过此种方式有弊端.就是多音字.

例如:重庆 默认为zhongqing所以如果要使用的,最好修改它的源码了,这里

提供了修改好的jar包 pinyinTokenFilter-1.1.0-RELEASE.jar 支持依赖solr6.6,

主要是针对多音字被舍去的问题,以及简拼和全拼不能兼得的问题.

具体修改步骤就不阐述了,因为做的不够完善.当然也可以自己修改制定.

pinyinTokenFilter-1.1.0-RELEASE.jarpinyinAnalyzer4.3.1.jarpinyin4j-2.5.0.jar

复制到solr/WEB-INF/lib目录下

修改后的属性介绍:

pinyin:属性是指全拼音,如重庆:chognqing,zhongqing默认为true,

isFirstChar:属性是指简拼.如重庆:cq,zq默认为false;都为TRUE则都有.

minTermLenght="2"至少为两个字符才转拼音,

minGram:这里配置的是2,因为如果1的话拼音简写会拆成单个字母,如重庆:cq,zq,c,z,q;

影响很严重;

<filter class="top.pinyin.index.solr.PinyinTokenFilterFactory" pinyin="true"

isFirstChar="true" minTermLenght="2" />

 

 

 <fieldType name="text_ik" class="solr.TextField">
		<analyzer type="index">
			<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" isMaxWordLength="false" useSmart="false" />
			<filter class="solr.LowerCaseFilterFactory" />
			<filter class="top.pinyin.index.solr.PinyinTokenFilterFactory" pinyin="true" isFirstChar="true" minTermLenght="2" />
			<filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="2" maxGram="20" />
		</analyzer>
		<analyzer type="query">
			<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" isMaxWordLength="false" useSmart="false" />
			<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" />
			<filter class="solr.LowerCaseFilterFactory" />
		</analyzer>
    </fieldType>

 结果如下:

 但是:
在开启高亮显示时进行搜索时发现,报错了.原因是solr的千古难题lucene默认的高亮机制会出问题.暂时没有解决办法,可能需要修改solr源码,

因为高亮显示的字段和搜索关键字长度不一致造成的,因为建立索引时一个关键字被索引成拼音和同义词,在搜索时使用拼音或同义词虽然查询出结果,

但是在高亮时回显的并不是拼音和同义词所以长度会不一致,同义词可以改成索引时不存储同义词,在query时查询时将关键字转换成多个同义词查询,

在回显时高亮的内容和关键字是匹配的所以不会出问题,如上是这样配置的.但却不能将拼音转汉字.所以只能选择简拼搜索,就是首字母那样长度是一致的

 

方案二:使用solrj工具将中文分词,之后利用pinyin4j将数据的拼音存储数据库,

用逗号隔开.建立Field,type选择text_general.它可以根据逗号拆分

并且不会将拼音再次拆分了.如果是中文的话就会把中文拆分成单个字.

此处就不演示了.此方法好处是便于维护,及对拼音进行处理和修改.

 方案三:同义词,不推荐;

solrj的使用:

将\solr-6.6.0\dist目录下的solr-solrj-6.6.0.jarsolr-core-6.6.0.jarsolrj-lib文件夹下的jar包

拷贝到项目中.

对于solrj的使用这里就不做过多的介绍了,

网上内容很多,这里就做个查询的示例.

HttpSolrClient httpSolrClient = new HttpSolrClient(URL);发现这个方法已经过时,现在使用

HttpSolrClient httpSolrClient = new HttpSolrClient.Builder("URL").build();

注意:在使用查询的时候,需要对一些特殊字符转义,因为solr中很多特殊符号有着不同的意义,

那么可以直接调用

ClientUtils.escapeQueryChars(key);就可以返回转义后的字符串了.

 

HttpSolrClient httpSolrClient = new HttpSolrClient.Builder("http://localhost:8080/solr/collection1").build();
SolrQuery query = new SolrQuery();//获取查询
query.setQuery("关*");//设置搜索关键词,注意:因为使用了IK中文分词,有时单个字符搜索不会出现结果,那么就需要使用通配符*代替.
query.set("df", "product_keywords");//设置默认搜索域,前面定义的
query.set("fq", "product_price:[0 TO 20]");//设置筛选条件,可多个
query.setStart(0);//设置开始的条数  用于分页
query.setRows(10);//设置显示条数  
query.addSort("score", ORDER.desc); //设置排序方式,可添加多个排序方式,有顺序的优先级.score为默认的排序方式,会根据结果的符合度排序.
//若不设置默认为score,若设置别的排序.则不会默认score,和空参构造.有参构造同理.
query.setHighlight(true);//设置高亮
query.addHighlightField("product_name");//设置高亮的field.
query.setHighlightSimplePre("<font color='red'>");
query.setHighlightSimplePost("</font>");
QueryResponse response = httpSolrClient.query(query);//执行查询.返回结果
long numFound = response.getResults().getNumFound();//查询总共条数
List<Map<String, Object>> resultList = response.getResults();//返回结果集
for (SolrDocument doc : resultList ) {
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();//获取高亮
List<String> productNames = highlighting.get((String) doc.get("id")).get("product_name");//取得高亮如果有,第一个值就是.这个地方和老版本不同,老版本是通过ID取,这里是通过ID的值区
.......
}

 

 

  • 大小: 44 KB
2
1
分享到:
评论
5 楼 dscq 2017-11-08  
linhao315 写道
pinyinTokenFilter-1.1.0-jar源码呢?solr 7.1存在适配问题,不兼容啊。

源码丢了,7.1还没试过
4 楼 dscq 2017-11-08  
wangq332 写道
中文同义词有点问题,在analysis时能查询到同义词,但是真的去查询时,同义词是找到了,但是结果却没有,难道只有我一个人有这样的问题吗

视具体情况而定,1.首先同义词建议少用,在solr中更确切的说法是等同词,所以在查询时是否查询关键字显示在了后面.2.如果是索引时使用同义词,没有被查询到的内容进行索引分析是否被建立了同义词索引.3.如果是索引时使用同义词,是否更改同义词后未重建索引  如果是索引时使用同义词,可以在analysis中分析没有命中的数据具体分词情况
3 楼 linhao315 2017-10-21  
pinyinTokenFilter-1.1.0-jar源码呢?solr 7.1存在适配问题,不兼容啊。
2 楼 wangq332 2017-09-22  
中文同义词有点问题,在analysis时能查询到同义词,但是真的去查询时,同义词是找到了,但是结果却没有,难道只有我一个人有这样的问题吗
1 楼 masuweng 2017-07-06  
      好好,值得收藏谢谢

相关推荐

    solr6.6-IK

    IK 分词器在 Solr 6.6 中的使用,大大提高了中文文本的检索效率和准确性。 首先,我们来理解什么是分词。分词是自然语言处理中的基础步骤,中文文本由于没有明显的空格或标点符号来指示单词边界,因此需要通过特定...

    solr6.x_IK中文分词工具

    Solr 是一个强大的开源搜索引擎,广泛应用于各类信息检索系统中。在处理中文文档时,一个优秀的中文...对于开发者来说,掌握如何在Solr中集成和使用IK分词器是一项必备的技能,有助于提升搜索系统的性能和用户体验。

    solr6.6官方文档

    solr6.6官方文档,英文版

    支持solr5.5 solr6.0中IK分词需要的资料

    IK分词器(Intelligent Chinese Analyzer for Solr,简称IK)是一款针对中文的高效分词工具,专为Solr和Lucene设计,旨在提高中文文本检索的准确性。 标题和描述提到的是针对Solr 5.5和Solr 6.0版本的IK分词器支持...

    lucene6.6+拼音分词+ik中文分词包

    《深入理解Lucene 6.6:拼音与IK中文分词技术详解》 在信息检索领域,Lucene作为一款强大的全文搜索引擎库,被广泛应用。在处理中文文本时,分词是至关重要的一步,它决定了搜索的精度和效果。本文将详细讲解如何在...

    IK分词solr5.0.0

    IK分词是中文自然语言处理领域中广泛应用的一种分词工具,尤其在搜索引擎和文本分析系统中,它的作用至关重要。Solr则是一个强大的、开源的企业级全文搜索引擎,它提供了高效的索引和查询功能,广泛用于大数据量的...

    solr环境搭建和中文分词器IK配置

    在本教程中,我们将深入探讨如何搭建Solr 7.2.1环境,并配置中文分词器IKAnalyzer以支持中文搜索。 首先,我们来了解Solr 7.2.1的安装步骤: 1. **下载Solr**:访问Apache Solr官方网站,下载最新稳定版的Solr,...

    solr ik分词器

    Solr是中国最流行的开源搜索引擎平台之一,而IK Analyzer是一款针对中文的高性能分词器,尤其在处理现代汉语的复杂情况时表现出色。本教程将详细解释如何在Solr中安装和使用IK分词器。 首先,让我们理解一下什么是...

    solr ik中文分词

    在处理中文文本时,由于中文的特殊性(词与词之间没有明显的分隔符),需要使用专门的分词器进行预处理,将连续的汉字流分割成有意义的词语,这个过程称为中文分词。IK Analyzer(简称IK)就是为了解决这个问题而...

    solr4.1+IK中文分词

    Solr4.1 + IK中文分词是针对Apache Solr搜索引擎的一个重要组合,它使得在中文环境下进行全文检索和分析变得更加高效和精确。Apache Solr是一个开源的企业级搜索平台,基于Lucene库,提供了高性能、可扩展的全文索引...

    solr7.x-ik分词器亲测可用.zip

    "solr7.x-ik分词器亲测可用.zip" 文件是一个包含针对 Solr 7.x 版本优化的 IK 分词器的压缩包,IK(Intelligent Chinese Analyzer)是广泛使用的中文分词库,专为处理中文文本而设计。这个亲测可用的版本意味着已经...

    最新Solr环境搭建与IKAnalyzer3分词整合.doc

    Solr环境搭建与IKAnalyzer3分词整合 在本文中,我们将详细介绍如何搭建 Solr 环境并将 IKAnalyzer3 ...通过上述步骤,我们可以成功地搭建 Solr 环境并将 IKAnalyzer3 分词器整合到 Solr 中,从而实现中文搜索的功能。

    solr6.x的IKAnalyzer配置智能分词

    IKAnalyzer是一款针对中文的开源分词器,它在处理中文词汇时表现优秀,尤其适用于搜索引擎和信息检索系统。在Solr中配置IKAnalyzer可以提升中文搜索的准确性和效率。以下是对"solr6.6的IKAnalyzer配置智能分词"的...

    ikanalyzer-solr8.4.0_solr8_solr_ikanalyzer_中文分词_

    在 Solr 环境中,ikanalyzer 的作用是为中文文档提供精确的分词服务,从而提升搜索质量和效率。Solr8.4.0 是 Apache Solr 的一个版本,这是一个高度可配置、高性能的全文搜索和分析引擎,广泛用于构建企业级搜索应用...

    Solr5.3.1搜索引擎搭建详细教程(包括集成mysql、添加中文分词、添加同义词、查询语法等)

    Solr 5.3.1搜索引擎搭建详细教程(包括集成mysql、添加中文分词、添加同义词、查询语法等)

    solr5的ik中文分词器源码

    在处理中文文本时,一个关键的组件就是中文分词器,而IK(Intelligent Chinese)分词器是Solr中常用的中文分词工具之一。本文将深入探讨"solr5的ik中文分词器源码"的相关知识点。 1. **IK分词器概述**: IK分词器...

    solr 5.0搭建 和使用 ik分词

    本篇文章将详细讲解如何搭建Solr 5.0,并使用IK分词器进行中文分词处理,提升搜索效果。 首先,我们需要下载Solr 5.0的安装包。你可以访问Apache官方站点或者镜像站点获取最新版本的Solr。解压缩下载的文件后,你会...

    solr中文分词jar包ik-analyzer 含class配置 ik-analyzer-7.5.0

    Solr是一款强大的全文搜索引擎,广泛应用于各种大数据检索场景。在处理中文内容时,分词是...总之,Ik Analyzer 7.5.0是Solr处理中文文本的得力工具,通过合理的配置和使用,可以提升Solr在中文搜索中的性能和准确性。

    solr6.1.0的IK中文分词

    IK(Intelligent Chinese Analyzer)中文分词器是广泛应用于Solr和Elasticsearch等搜索引擎中的一个优秀插件,特别适合处理中文文本。 在Solr 6.1.0 版本中,IK 分词器已经被集成并优化,以更好地适应中文语言的...

Global site tag (gtag.js) - Google Analytics