原文链接:http://blog.csdn.net/dm_vincent/article/details/41720193
多词查询(Multi-word Queries)
如果我们一次只能搜索一个词,那么全文搜索就会显得相当不灵活。幸运的是,通过match
查询来实现多词查询也同样简单:
GET /my_index/my_type/_search
{
"query": {
"match": {
"title": "BROWN DOG!"
}
}
}
以上的查询会返回所有的四份文档:
{
"hits": [
{
"_id": "4",
"_score": 0.73185337,
"_source": {
"title": "Brown fox brown dog"
}
},
{
"_id": "2",
"_score": 0.47486103,
"_source": {
"title": "The quick brown fox jumps over the lazy dog"
}
},
{
"_id": "3",
"_score": 0.47486103,
"_source": {
"title": "The quick brown fox jumps over the quick dog"
}
},
{
"_id": "1",
"_score": 0.11914785,
"_source": {
"title": "The quick brown fox"
}
}
]
}
文档4的相关度最高因为它包含了"brown"
两次和"dog"
一次。 文档2和文档3都包含了"brown"
和"dog"
一次,同时它们的title
字段拥有相同的长度,因此它们的分值相同。 文档1只包含了"brown"
。
因为match
查询需要查询两个词条 - ["brown","dog"]
- 在内部它需要执行两个term
查询,然后将它们的结果合并来得到整体的结果。因此,它会将两个term
查询通过一个bool
查询组织在一起,我们会在合并查询一节中详细介绍。
从上面的例子中需要吸取的经验是,文档的title
字段中只需要包含至少一个指定的词条,就能够匹配该查询。如果匹配的词条越多,也就意味着该文档的相关度就越高。
提高精度(Improving Precision)
匹配任何查询词条就算作匹配的话,会导致最终结果中有很多看似无关的匹配。它是一个霰弹枪式的策略(Shotgun Approach)。我们大概只想要显示包含了所有查询词条的文档。换言之,相比brown OR dog
,我们更想要的结果是brown AND dog
。
match
查询接受一个operator
参数,该参数的默认值是"or"
。你可以将它改变为"and"
来要求所有的词条都需要被匹配:
GET /my_index/my_type/_search
{
"query": {
"match": {
"title": {
"query": "BROWN DOG!",
"operator": "and"
}
}
}
}
match
查询的结构需要被稍稍改变来容纳operator
参数。
这个查询的结果会将文档1排除在外,因为它只包含了一个查询词条。
控制精度(Controlling Precision)
在all和any中选择有种非黑即白的感觉。如果用户指定了5个查询词条,而一份文档只包含了其中的4个呢?将"operator"
设置成"and"
会将它排除在外。
有时候这正是你想要的,但是对于大多数全文搜索的使用场景,你会希望将相关度高的文档包含在结果中,将相关度低的排除在外。换言之,我们需要一种介于两者中间的方案。
match
查询支持minimum_should_match
参数,它能够让你指定有多少词条必须被匹配才会让该文档被当做一个相关的文档。尽管你能够指定一个词条的绝对数量,但是通常指定一个百分比会更有意义,因为你无法控制用户会输入多少个词条:
GET /my_index/my_type/_search
{
"query": {
"match": {
"title": {
"query": "quick brown dog",
"minimum_should_match": "75%"
}
}
}
}
当以百分比的形式指定时,minimum_should_match
会完成剩下的工作:在上面拥有3个词条的例子中,75%
会被向下舍入到66.6%
,即3个词条中的2个。无论你输入的是什么,至少有2个词条被匹配时,该文档才会被算作最终结果中的一员。
minimum_should_match
参数非常灵活,根据用户输入的词条的数量,可以适用不同的规则。具体可以参考minimum_should_match
参数的相关文档。
为了更好地了解match
查询是如何处理多词查询的,我们需要看看bool
查询是如何合并多个查询的。
合并查询(Combining Queries)
在合并过滤器中我们讨论了使用bool
过滤器来合并多个过滤器以实现and
,or
和not
逻辑。bool
查询也做了类似的事,但有一个显著的不同。
过滤器做出一个二元的决定:这份文档是否应该被包含在结果列表中?而查询,则更加微妙。它们不仅要决定是否包含一份文档,还需要决定这份文档有多相关。
和过滤器类似,bool
查询通过must
,must_not
以及should
参数来接受多个查询。比如:
GET /my_index/my_type/_search
{
"query": {
"bool": {
"must": { "match": { "title": "quick" }},
"must_not": { "match": { "title": "lazy" }},
"should": [
{ "match": { "title": "brown" }},
{ "match": { "title": "dog" }}
]
}
}
}
title
字段中含有词条quick
,且不含有词条lazy
的任何文档都会被作为结果返回。目前为止,它的工作方式和bool
过滤器十分相似。
差别来自于两个should
语句,它表达了这种意思:一份文档不被要求需要含有词条brown
或者dog
,但是如果它含有了,那么它的相关度应该更高。
{
"hits": [
{
"_id": "3",
"_score": 0.70134366,
"_source": {
"title": "The quick brown fox jumps over the quick dog"
}
},
{
"_id": "1",
"_score": 0.3312608,
"_source": {
"title": "The quick brown fox"
}
}
]
}
文档3的分值更高因为它包含了brown
以及dog
。
分值计算(Score Calculation)
bool
查询通过将匹配的must
和should
语句的_score
相加,然后除以must
和should
语句的总数来得到相关度分值_score
。
must_not
语句不会影响分值;它们唯一的目的是将不需要的文档排除在外。
控制精度(Controlling Precision)
所有的must
语句都需要匹配,而所有的must_not
语句都不能匹配,但是should
语句需要匹配多少个呢?默认情况下,should
语句一个都不要求匹配,只有一个特例:如果查询中没有must
语句,那么至少要匹配一个should
语句。
正如我们可以控制match
查询的精度,我们也能够通过minimum_should_match
参数来控制should
语句需要匹配的数量,该参数可以是一个绝对数值或者一个百分比:
GET /my_index/my_type/_search
{
"query": {
"bool": {
"should": [
{ "match": { "title": "brown" }},
{ "match": { "title": "fox" }},
{ "match": { "title": "dog" }}
],
"minimum_should_match": 2
}
}
}
以上查询的而结果仅包含以下文档:
title
字段包含: "brown" AND "fox"
或者 "brown" AND "dog"
或者 "fox" AND "dog"
如果一份文档含有所有三个词条,那么它会被认为更相关。
相关推荐
Elasticsearch 分析插件 IK 是一款为 Elasticsearch 设计的高性能中文分词器,它的全称为 "elasticsearch-analysis-ik"。此版本是 7.4.2,专为 Elasticsearch 7.4.2 版本优化。在中文文档处理中,分词是至关重要的...
在Elasticsearch中,分词器的作用至关重要,它负责将用户输入的文本进行词汇切分,以便进行后续的搜索和分析操作。IK分词器以其高效、灵活和全面的特性,被广泛应用于Elasticsearch的中文处理场景。 **版本信息** ...
Elasticsearch 7.10.0 是一个高度可扩展的全文搜索引擎,广泛应用于日志分析、实时数据分析、网站搜索等多个领域。这个压缩包“elasticsearch-7.10.0-linux-aarch64.tar.gz”是专为Linux平台上的ARM64架构(即64位...
在 Elasticsearch 中,分析是文本数据预处理的关键步骤,它将用户输入的全文本转换为可搜索的索引项。IK 分析器是目前最流行的 Elasticsearch 中文分词器之一,它由社区维护并持续更新,以适应不断变化的语言处理...
Elasticsearch是一款强大的开源搜索引擎,基于Lucene库构建,提供了分布式、实时、可扩展的数据存储和搜索功能。在处理大量数据时,为了提高查询效率和准确性,常常需要使用到同义词分析。"elasticsearch-analysis-...
Elasticsearch 6.2.4 是一个高度可扩展的开源全文搜索引擎,它以其强大的分布式特性、实时分析功能以及高效的数据检索能力而闻名。这个版本提供了改进的性能、新的特性和优化,使得开发者和管理员能够更好地管理和...
Elasticsearch 5.5.1 是一个强大的开源全文搜索引擎,广泛应用于数据分析、日志分析、网站搜索等场景。这个安装包提供了完整的 Elasticsearch 平台,用户只需解压并进行适当的配置,即可启动并使用。以下是对这个...
Elastic Search+ik分词器的扩展词库,可以用来扩展开发自定义词库内容。从而增加商品的搜索准确度。
Elasticsearch 7.2.0 是一个高度可扩展的开源全文搜索引擎,它设计用于提供快速、准实时的搜索和分析能力。这个版本是针对Windows操作系统的,采用ZIP格式的安装包,使得用户可以轻松地在Windows环境下进行安装和...
根据提供的文件信息,我们可以推断出这是一套关于Elasticsearch的学习资料,旨在帮助学习者掌握Elasticsearch的核心知识及进阶技巧。接下来,我们将基于这些信息,详细展开相关的知识点。 ### Elasticsearch简介 ...
Elasticsearch的别名(Alias)可以将多个索引合并成一个逻辑索引,方便搜索和管理。 7. Elasticsearch的快照 Elasticsearch的快照(Snapshot)可以将索引的数据备份到外部存储设备,方便数据的恢复和迁移。 8. ...
4. **全文搜索**:Elasticsearch 提供了强大的全文搜索引擎,能够进行复杂的模糊匹配和同义词搜索,支持多种分析器,如英文的 Standard Analyzer 和中文的 IK Analyzer,用于处理不同语言的文本。 5. **聚合分析**...
- **查询结果的重打分**:除了原始的查询评分外,Elasticsearch还支持对查询结果进行二次打分,从而进一步优化搜索结果的相关性。 - **批处理**:批处理是指将多个操作打包成一个请求进行处理,这有助于提高系统的...
第1章 Elasticsearch入门 1 1.1 Elasticsearch是什么 1 1.1.1 Elasticsearch的历史 2 1.1.2 相关产品 3 1.2 全文搜索 3 1.2.1 Lucene介绍 4 1.2.2 Lucene倒排索引 4 1.3 基础知识 6 1.3.1 Elasticsearch术语及概念 ...
Elasticsearch 1.0 是一个高性能、可扩展的全文搜索引擎,基于 Lucene 库构建,提供了分布式、实时、多租户的功能。它不仅是一个搜索服务,还具备数据分析与数据存储的能力,广泛应用于日志分析、监控、推荐系统等...