我刚刚开始学习弹性搜索,想知道从elasticsearch website复制的以下句子中的术语和值之间的区别:
“请务必注意_all字段将每个字段的原始值组合为一个字符串。它不会将每个字段中的字词组合在一起。
虽然我了解值是什么,但我对每个字段的条款都不知所措! 有人可以帮我解释一下这个意思吗?
答案 0 :(得分:1)
您粘贴的段落前面的段落给出了一些解释:
上例中的date_of_birth字段被识别为日期字段,因此将索引表示1970-10-24 00:00:00 UTC的单个术语。但是,_all字段将所有值视为字符串,因此日期值被索引为三个字符串术语:“1970”,“24”,“10”。
换句话说,_all
字段从索引文档中获取原始值,通过自己的分析器运行它们,生成自己的术语,然后存储在索引中。它不使用其他字段的分析器生成的terms
。
我在上面粘贴的段落中给出了一个例子。它解释了date_of_birth
字段将被识别为date
类型,因此将分析字段值并将其存储为单个字词1970-10-24 00:00:00 UTC
。因此,如果您尝试将date_of_birth
字段与match
查询匹配,请执行以下操作:
{ "query": { "match: { "date_of_birth": "24 10" } } }
您将找不到该文档,因为解析器无法将提供的值解析为日期。
另一方面,如果您将在_all
字段上运行相同的查询,您肯定会找到该文档:
{ "query": { "match: { "_all": "24 10" } } }
因为,正如文档所示,_all
字段将包含以下text
类型字词:["1970", "10", "24"]
。
让我们看另一个例子。假设您有以下mapping
user
类型:
"user": {
"properties": {
"nickname": { "type": "keyword" },
"name": { "type": "text" },
"age": { "type": "integer" }
}
}
您索引以下文档:
{
"nickname": "Super-Man",
"name": "John",
"age": 25
}
Elasticsearch将根据其类型分析该文档的字段,最终为每个字段存储以下术语:
_all
:["super", "man", "john", "25"]
- 所有字符串nickname
:["Super-Man"]
name
:["john"]
age
:[25]
- 整数因此,如果您尝试使用match
(或term
)查询来查找此文档,其中nickname
等于super
您将无法找到该文档。由于nickname
字段已被分析为keyword
,因此您必须使用完全字符串来查找它 - "Super-Man"
。
但是,如果您尝试使用match
_all
等于super
的{{1}}查询来查找此文档,您将会找到它。
另一方面,如果您尝试使用term
字段_all
字段查找此文档的整数值25
,则无法找到它。同样,因为_all
字段只是text
字段:
{ "query": { term": { "_all": 25} } }
但是在age
字段上运行相同的查询将返回文档:
{ "query": { term": { "age": 25} } }