每个字段的术语与_all elasticsearch中每个字段的值

时间:2017-10-21 19:16:25

标签: elasticsearch

我刚刚开始学习弹性搜索,想知道从elasticsearch website复制的以下句子中的术语和值之间的区别:

  

“请务必注意_all字段将每个字段的原始值组合为一个字符串。它不会将每个字段中的字词组合在一起。

虽然我了解是什么,但我对每个字段的条款都不知所措! 有人可以帮我解释一下这个意思吗?

1 个答案:

答案 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} } }