
首先准备环境
ElasticSearch : https://mirrors.huaweicloud.com/elasticsearch/?C=N&O=D
logstash : https://mirrors.huaweicloud.com/logstash/?C=N&O=D
kibana : https://mirrors.huaweicloud.com/kibana/?C=N&O=D
ik : https://github.com/medcl/elasticsearch-analysis-ik/tree/v7.8.0
ElasticSearch 是一个实时分布式搜索和分析引擎,主要用于全文搜索,结构化搜索,分析以及将这三者混合使用。
Lucene 是一个全文检索引擎的架构。
ElasticSearch vs Solr 总结
(1)es基本是开箱即用,非常简单。Solr安装略微复杂一丢丢,可关注( solr6.6教程-基础环境搭建(一) )
(2)Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能。
(3)Solr 支持更多格式的数据,比如JSON、XML、CSV,而 Elasticsearch 仅支持json文件格式。
(4)Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供,例如图形化界面需要kibana友好支撑
(5)Solr 查询快,但更新索引时慢(即插入删除慢),用于电商等查询多的应用;
ES建立索引快(即查询慢),即实时性查询快,用于facebook新浪等搜索。
Solr 是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用。
(6)Solr比较成熟,有一个更大,更成熟的用户、开发和贡献者社区,而 Elasticsearch相对开发维护者较少,更新太快,学习使用成本较高。
ik分词器:
ik提供了两个分词算法:ik_smart和ik_max_word,其中ik_smart为最少切分,ik_max_word为最细粒度切分。
ik_smart:
ik_max_word:
ik分词器可以增加自己的配置,自己配置词典。
Elasticsearch默认提供的分词器,会把每个汉字分开,而不是我们想要的根据关键词来分词。例如:
我们会得到这样的结果:
[html] view plain copy
{
tokens: [
{
token: text
start_offset: 2
end_offset: 6
type: <ALPHANUM>
position: 1
}
{
token: 我
start_offset: 9
end_offset: 10
type: <IDEOGRAPHIC>
position: 2
}
{
token: 是
start_offset: 10
end_offset: 11
type: <IDEOGRAPHIC>
position: 3
}
{
token: 中
start_offset: 11
end_offset: 12
type: <IDEOGRAPHIC>
position: 4
}
{
token: 国
start_offset: 12
end_offset: 13
type: <IDEOGRAPHIC>
position: 5
}
{
token: 人
start_offset: 13
end_offset: 14
Elasticsearch 中文搜索时遇到几个问题:
接下来从以下几点讲一下怎么ES中文分词
索引时,为了提供索引的覆盖范围,通常会采用ik_max_word分析器,会以最细粒度分词索引,搜索时为了提高搜索准确度,会采用ik_smart分析器,会以粗粒度分词
字段mapping设置如下:
analysis索引分析模块充当analyzer分析器的可配置注册表,通过analyzer对文档索引阶段的字段和搜索String进行处理,自定义analyzer时,通常需要character filter tokenizer token filters来完成
首先字符串经过过滤器(character filter),他们的工作是在分词前处理字符串。字符过滤器能够去除HTML标记,例如把“<a>”变成“a
英文分词可以根据空格将单词分开,中文分词比较复杂,可以采用机器学习算法来分词
最后,每个词都通过所有表征过滤(token filters),他可以修改词(例如将“Quick”转为小写),去掉词(例如停用词像“a”、“and”、“the”等等),或者增加词(例如同义词像“a”、“and”、“the”等等)或者增加词(例如同义词像“jump”和“leap”)。
character filter-->>tokenizer-->>token filters
官网example:
通常为了保证索引时覆盖度和搜索时准确度,索引分词器采用ik_max_word,搜索分析器采用ik_smart模式
因为倒排索引中的数据是索引时由分词器来处理的,如果分词器有变化,那么搜索时query关键词即使和doc中关键词相同,但是因为分词器的原因,分出来的词会出现不匹配的情况,因此当mapping或者分词器字典同义词词典等发生变化时,需要reindex索引数据
2.1 建议同义词词典
自定义添加同义词通过ik分词器
想查看同义词效果或者测试分词效果
suggest词需要对拼音前缀,全拼,中文进行前缀匹配,例如:“百度”一词,键入"baidu","bd","百"都必须匹配到,因此在索引的时候需要一词分多个分词器来索引保存,中文采用单字分词,拼音首字母和全拼需要自定义analyzer来索引。
部分内容有待完善
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)