原文链接:http://blog.csdn.net/dm_vincent/article/details/41956229
多值字段(Multivalue Fields)
在多值字段上使用短语匹配会产生古怪的行为:
PUT /my_index/groups/1
{
"names": [ "John Abraham", "Lincoln Smith"]
}
运行一个针对Abraham Lincoln的短语查询:
GET /my_index/groups/_search
{
"query": {
"match_phrase": {
"names": "Abraham Lincoln"
}
}
}
令人诧异的是,以上的这份文档匹配了查询。即使Abraham以及Lincoln分属于name数组的两个人名中。发生这个现象的原因在于数组在ES中的索引方式。
当John Abraham被解析时,它产生如下信息:
- 位置1:john
- 位置2:abraham
然后当Lincoln Smith被解析时,它产生了:
- 位置3:lincoln
- 位置4:smith
换言之,ES对以上数组分析产生的词条列表和解析单一字符串John Abraham Lincoln Smith时产生的结果是一样的。在我们的查询中,我们查询邻接的abraham和lincoln,而这两个词条在索引中确实存在并且邻接,因此查询匹配了。
幸运的是,有一个简单的方法来避免这种情况,通过position_offset_gap参数,它在字段映射中进行配置:
DELETE /my_index/groups/
PUT /my_index/_mapping/groups
{
"properties": {
"names": {
"type": "string",
"position_offset_gap": 100
}
}
}
position_offset_gap设置告诉ES需要为数组中的每个新元素设置一个偏差值。因此,当我们再索引以上的人名数组时,会产生如下的结果:
- 位置1:john
- 位置2:abraham
- 位置103:lincoln
- 位置104:smith
现在我们的短语匹配就无法匹配该文档了,因为abraham和lincoln之间的距离为100。你必须要添加一个值为100的slop的值才能匹配。
越近越好(Closer is better)
短语查询(Phrase Query)只是简单地将不含有精确查询短语的文档排除在外,而邻近查询(Proximity Query) - 一个slop值大于0的短语查询 - 会将查询词条的邻近度也考虑到最终的相关度_score中。通过设置一个像50或100这样的高slop值,你可以排除那些单词过远的文档,但是也给予了那些单词邻近的文档一个更高的分值。
下面针对quick dog的邻近查询匹配了含有quick和dog的两份文档,但是给与了quick和dog更加邻近的文档一个更高的分值:
POST /my_index/my_type/_search
{
"query": {
"match_phrase": {
"title": {
"query": "quick dog",
"slop": 50
}
}
}
}
{
"hits": [
{
"_id": "3",
"_score": 0.75,
"_source": {
"title": "The quick brown fox jumps over the quick dog"
}
},
{
"_id": "2",
"_score": 0.28347334,
"_source": {
"title": "The quick brown fox jumps over the lazy dog"
}
}
]
}
使用邻近度来提高相关度
尽管邻近度查询(Proximity Query)管用,但是所有的词条都必须出现在文档的这一要求显的过于严格了。这个问题和我们在全文搜索(Full-Text Search)一章的精度控制(Controlling Precision)一节中讨论过的类似:如果7个词条中有6个匹配了,那么该文档也许对于用户而言已经足够相关了,但是match_phrase查询会将它排除在外。
相比将邻近度匹配作为一个绝对的要求,我们可以将它当做一个信号(Signal) - 作为众多潜在匹配中的一员,会对每份文档的最终分值作出贡献(参考多数字段(Most Fields))。
我们需要将多个查询的分值累加这一事实表示我们应该使用bool查询将它们合并。
我们可以使用一个简单的match查询作为一个must子句。该查询用于决定哪些文档需要被包含到结果集中。可以通过minimum_should_match参数来去除长尾(Long tail)。然后我们以should子句的形式添加更多特定查询。每个匹配了should子句的文档都会增加其相关度。
GET /my_index/my_type/_search
{
"query": {
"bool": {
"must": {
"match": {
"title": {
"query": "quick brown fox",
"minimum_should_match": "30%" //至少匹配30%
}
}
},
"should": {
"match_phrase": {
"title": {
"query": "quick brown fox",
"slop": 50
}
}
}
}
}
}
毫无疑问我们可以向should子句中添加其它的查询,每个查询都用来增加特定类型的相关度。
相关推荐
中文分词:elasticsearch-analysis-ik 是基于最大正向匹配算法实现的中文分词器。它能够将中文文本按照合理的单词边界进行分割,并提供高质量的分词结果。 词库扩展性:elasticsearch-analysis-ik 采用了可扩展的...
arcgis elasticSearch es 矢量数据导入插件 数据建模 mapping indexsetting 字段映射 索引建模支持geoshape、shape,text索引支持keyword/ngram/edgeNgram/ikSmart,快速导入,兼容multipolygon,带洞,多面,使用时...
Elasticsearch(简称ES)是一款强大的开源搜索引擎,广泛应用于大数据领域的全文检索。它以其高可扩展性、实时性能以及丰富的分析能力著称。在中文环境下,由于汉字的复杂性,分词是实现有效搜索的关键步骤。为此,...
最新版 elasticsearch-analysis-ik-8.7.0.zip最新版 elasticsearch-analysis-ik-8.7.0.zip最新版 elasticsearch-analysis-ik-8.7.0.zip最新版 elasticsearch-analysis-ik-8.7.0.zip
Elasticsearch是一个强大的开源搜索引擎,广泛应用于大数据分析和实时数据检索。在中文处理方面,它需要依赖特定的分词插件来对文本进行有效的索引和搜索。在给定的标题和描述中,提到了两个重要的插件:"elastic...
"elasticsearch-analysis-ik"是针对Elasticsearch的一个中文分词插件,它的主要功能是提供高效、精准的中文分词能力,使得Elasticsearch能够更好地理解和处理中文文本数据。 在Elasticsearch 7.10.0版本中,...
最新版elasticsearch-analysis-ik-8.8.2.zip最新版elasticsearch-analysis-ik-8.8.2.zip最新版elasticsearch-analysis-ik-8.8.2.zip最新版elasticsearch-analysis-ik-8.8.2.zip
1. **下载与安装**:将`elasticsearch-analysis-dynamic-synonym-7.6.2.jar`文件复制到ES的`plugins`目录下,然后重启ES服务,系统会自动识别并加载插件。 2. **配置文件**:创建`synonyms.txt`文件,包含同义词...
《Elasticsearch中文分词插件:elasticsearch-analysis-ik-7.4.2》 在深入探讨Elasticsearch的中文分词插件elasticsearch-analysis-ik-7.4.2之前,首先需要理解Elasticsearch的基础知识。Elasticsearch是一款高性能...
"elasticsearch-analysis-dynamic-synonym-7.0.0.zip"是一个专为Elasticsearch设计的同义词插件,它的主要目的是在搜索过程中实现同义词的智能匹配,提高搜索的准确性和用户体验。 这个插件的独特之处在于它支持...
值得注意的是,在安装前,确保你的Elasticsearch版本与插件版本匹配,以免出现兼容性问题。 在使用`elasticsearch-jieba-plugin`时,你需要配置Elasticsearch的索引设置,指定使用jieba分词器。在创建索引或者更新...
在现代大数据分析和搜索引擎领域,Elasticsearch(ES)因其高效、灵活的全文检索能力而备受青睐。然而,对于中文这样的多字节语言,如何准确地进行分词是关键。这时,我们就需要引入专门的中文分词器。本文将详细...
本文将深入探讨Elasticsearch的IK分词器,即elasticsearch-analysis-ik-7.16.2,以及与其相关的依赖库。 **一、elasticsearch-analysis-ik-7.16.2概述** elasticsearch-analysis-ik是针对Elasticsearch的中文分词...
Elasticsearch(ES)作为一个开源的全文搜索引擎,因其强大的搜索功能和分布式特性而备受青睐。然而,对于中文这种复杂的语言,分词是搜索引擎理解文本的关键步骤。本文将详细介绍elasticsearch-analysis-ik-7.10.2...
6. **多字段分析**:在 Elasticsearch 索引配置中,可以为不同的字段指定不同的分析器,以满足不同字段的分析需求。 **四、安装与配置** 1. **下载**:从官方仓库或其他可信来源下载 elasticsearch-analysis-ik-...
本文将深入探讨这个分词器的特性和使用方法,并结合相关标签,如“elasticsearch”、“综合资源”、“大数据”、“big data”以及“搜索引擎”,解析其在大数据环境中的重要角色。 一、elasticsearch-analysis-ik ...
在IT领域,尤其是在搜索引擎优化和大数据分析中,Elasticsearch(ES)是一个广泛使用的开源全文检索引擎。它基于Lucene库,提供了分布式、实时、高可用性以及容错能力的数据存储和搜索解决方案。本篇文章将重点讲解...
本文将深入探讨"elasticsearch-analysis-ik-7.3.2"这个版本,以及与其相关的技术细节。 首先,"elasticsearch-analysis-ik-7.3.2"是IK分词器的最新版本,发布于2019年9月15日。此版本针对Elasticsearch 7.3.2进行了...
标签 "elasticsearch elasticsearch" 强调了这个资源与Elasticsearch紧密相关,涵盖了Elasticsearch的核心技术和应用。 从压缩包内的文件名称列表来看,我们可以推断出以下几个关键知识点: 1. **mysql-connector-...
在标题中提到的"elasticsearch-bulk-insert-plugin-8.2.0.0-342.zip"是一个针对Kettle(也称为Pentaho Data Integration)的插件,它允许用户通过Kettle与Elasticsearch进行批量数据插入。Kettle是一款开源的数据...