博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Elasticsearch1.x 拼音分词实现全拼首字母中文混合搜索
阅读量:5839 次
发布时间:2019-06-18

本文共 3767 字,大约阅读时间需要 12 分钟。

一、插件简介

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的安装请参考:

下载地址:

当然也可以自己下载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": [      "
" ], "post_tags": [ "
" ], "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("")                .setHighlighterPostTags("
") .addHighlightedField("content") .execute().actionGet(); System.out.println(response); }

查询结果如下:

转载于:https://www.cnblogs.com/chennanlcy/p/6591793.html

你可能感兴趣的文章
Python知识点-内置函数
查看>>
【java&c++】父子类中同名函数的覆盖问题
查看>>
Box2D入门第一天
查看>>
小组成员的个人计划表
查看>>
常见黑盒测试方法【转】
查看>>
【leetcode】1. Two Sum
查看>>
值类型引用类型
查看>>
数据库语句
查看>>
Nginx日志分割脚本
查看>>
malloc free vs new delete
查看>>
JavaScript系列目录
查看>>
代码中根据不同的类型获取多个标签的中文翻译
查看>>
tkinter简单打开网址 + 执行系统命令
查看>>
怎么分辨linux是红帽还是Centos系统
查看>>
Attribute在.net编程中的应用(五)
查看>>
Visual Studio 2017中如何创建安装打包项目
查看>>
Fire Net(hdu1045)
查看>>
「一本通 1.1 练习 2」数列分段
查看>>
获取Android源码跟官方Linux内核源码
查看>>
'gulp'不是内部或者外部命令,也不是可运行的程序
查看>>