Elasticsearch1.x 拼音分词实现全拼首字母中文混合搜索
来源:互联网 发布:yy刷粉丝软件 编辑:程序博客网 时间:2024/05/06 05:13
一、插件简介
elasticsearch-analysis-lc-pinyin是一款elasticsearch拼音分词插件,可以支持按照全拼、首字母,中文混合搜索。
首先举个栗子说明下,我们在淘宝搜索框中输入“jianpan” 可以搜索到关键字包含“键盘”的商品。不仅仅输入全拼,有时候我们输入首字母、拼音和首字母、中文和首字母的混合输入,比如:“键pan”、“j盘”、“jianp”、“jpan”、“jianp”、“jp” 等等,都应该匹配到键盘。通过elasticsearch-analysis-lc-pinyin这个插件就能做到类似的搜索
二、安装插件
elasticsearch-analysis-lc-pinyin一共有两个版本分别是1.4.5和2.2.2,和es的版本对应
1.4.5 这个版本对应ES1.X
2.2.2这个版本对应ES2.X
请根据需要安装对应的版本,下面地址中压缩包已经包含了这两个版本
es2.x的安装请参考:http://blog.csdn.net/chennanymy/article/details/52744154
下载地址:http://download.csdn.net/detail/chennanymy/9614699
当然也可以自己下载elasticsearch-analysis-lc-pinyin的源码自己maven build出来,这样可以避免版本冲突
git 地址:http://git.oschina.net/music_code_m/elasticsearch-analysis-lc-pinyin
如下,我已将下载下来的包放在 /home/chennan/soft 目录下,下面我将以elasticsearch1.4.5为例安装elasticsearch-analysis-lc-pinyin-1.4.5拼音分词器
进入到es的plugins目录,下面是未安装时的样子
接着打开终端命令行执行如下命令安装插件
./../bin/plugin --install analysis-lc-pinyin --url file:/home/chennan/soft/elasticsearch-analysis-lc-pinyin-1.4.5.zip
粗线上面结果就表示安装成功了 ^ ^,安装完成后会在plugins目录下生成一个 analysis-lc-pinyin的目录,如下
接下来配置elasticsearch.yml,在末尾加上如下配置,如下因为我也安装了IK分词器所以配置这样,如果你没有安装IK可以将下面ik的部分删除
index: analysis: analyzer: ik: alias: [ik_analyzer] type: org.elasticsearch.index.analysis.IkAnalyzerProvider ik_max_word: type: ik use_smart: false ik_smart: type: ik use_smart: true lc: alias: [lc_analyzer] type: org.elasticsearch.index.analysis.LcPinyinAnalyzerProvider lc_index: type: lc analysisMode: index lc_search: type: lc analysisMode: search
然后启动es,这里我启动两个节点。从启动日志中可以看到es成功加载了拼音插件,如下
到这里,插件就安装完成了。我们可以通过一个简单的curl命令来测试分词器时候正常工作
curl -XGET '192.168.0.107:9200/_analyze?analyzer=lc_search&pretty' -d 'dafeiji'
输入“dafeiji”可以切分出来“da”、“fei”、“ji” 证明一切都OK啦
接下来就来试试借助这个拼音分词器来执行搜索,看看效果
1、首先建立一个索引 ,然后执行putmapping , 这里的索引名叫index,type叫fulltext,其中content这个字段采用拼音分词。注意这里用到两个不同的分词器
索引过程采用:lc_index分词器
搜索过程采用:lc_search分词器
curl -XPUT http://localhost:9200/indexcurl -XPOST http://localhost:9200/index/fulltext/_mapping -d'{ "fulltext": { "_all": { "index_analyzer": "lc_index", "search_analyzer": "lc_search", "term_vector": "no", "store": "false" }, "properties": { "content": { "type": "string", "store": "no", "term_vector": "with_positions_offsets", "index_analyzer": "lc_index", "search_analyzer": "lc_search", "include_in_all": "true", "boost": 8 } } }}'
然后索引几条数据,这里索引的4个公司的名称,陆金所、阿里巴巴、腾讯、百度、如下:
接下来执行几个搜索,查询的DSL像这样
{ "query": { "match": { "content": { "query": "bai度", "analyzer": "lc_search", "type": "phrase" } } }, "highlight": { "pre_tags": [ "<tag1>" ], "post_tags": [ "</tag1>" ], "fields": { "content": {} } }}
搜索“bai度”
搜索“阿li巴b”
搜索“ljs”
搜索“alibb”
搜索“lujinsuo”
下面使用es 客户端来做查询
@Test public void testPinyinSearch() { final String index = "index"; final String type = "fulltext"; SearchRequestBuilder requestBuilder = elasticIndexOperateHelper.getClient().prepareSearch(index).setTypes(type); QueryBuilder pinyinSearch = QueryBuilders .matchQuery("content", "lu金s") .type(MatchQueryBuilder.Type.PHRASE) .analyzer("lc_search") .zeroTermsQuery(MatchQueryBuilder.ZeroTermsQuery.NONE); SearchResponse response = requestBuilder .setQuery(pinyinSearch) .setHighlighterPreTags("</tag1>") .setHighlighterPostTags("<tag1>") .addHighlightedField("content") .execute().actionGet(); System.out.println(response); }
查询结果如下:
- Elasticsearch1.x 拼音分词实现全拼首字母中文混合搜索
- Elasticsearch1.x 基于lc-pinyin和ik分词实现 中文、拼音、同义词搜索
- 中文转拼音全拼和首字母
- elasticsearch实现中文分词和拼音分词混合查询+CompletionSuggestion
- Android联系人按拼音排序以及按汉字首字母或全拼搜索
- c#将中文转换成拼音,以空格隔开,全拼,获取汉字首字母,PinyinHelper
- Android通讯录模糊匹配搜索实现(号码、首字母、简拼、全拼)
- Android通讯录模糊匹配搜索实现(号码、首字母、简拼、全拼)
- Android通讯录模糊匹配搜索实现(号码、首字母、简拼、全拼)
- Android通讯录模糊匹配搜索实现(号码、首字母、简拼、全拼)
- Android类似通讯录模糊匹配搜索实现(号码、首字母、简拼、全拼)
- 获取汉字的全拼和拼音首字母
- 获得汉字拼音的首字母和全拼
- 将汉字转为全拼或返回拼音首字母
- SQL将汉字转化为拼音(首字母、全拼)
- PHP 汉字转拼音类(全拼与首字母)
- 《android2.2自带通讯录》之联系人按拼音排序以及按汉字首字母或全拼搜索
- 《android2.2自带通讯录》之联系人按拼音排序以及按汉字首字母或全拼搜索
- [LeetCode] 268. Missing Number
- 分类 block变量
- strcpy和memcpy的区别
- 如何把软件安装到安卓系统文件里,就是/system/app里面
- tee指令的妙用
- Elasticsearch1.x 拼音分词实现全拼首字母中文混合搜索
- 153. Find Minimum in Rotated Sorted Array
- shell读文件时无法读入tab的问题
- 消息队列中点对点与发布订阅区别
- hibernate注解配置关联关系
- Android的第一个程序遇到的问题
- iOS 开发中你是否遇到这些经验问题(一)
- BZOJ 4650([Noi2016]优秀的拆分-SA)
- ListView 与BaseAdapter