精确值字段(Exact-value Fields)

在结束对于多字段查询的讨论之前的最后一个话题是作为not_analyzed类型的精确值字段。在multi_match查询中将not_analyzed字段混合到analyzed字段中是没有益处的。

原因可以通过validate-query进行简单地验证,假设我们将title字段设置为not_analyzed:

  1. GET /_validate/query?explain
  2. {
  3. "query": {
  4. "multi_match": {
  5. "query": "peter smith",
  6. "type": "cross_fields",
  7. "fields": [ "title", "first_name", "last_name" ]
  8. }
  9. }
  10. }

// SENSE: 110_Multi_Field_Search/55_Not_analyzed.json

因为title字段时没有被解析的,它会以将整个查询字符串作为一个词条进行搜索!

  1. title:peter smith
  2. (
  3. blended("peter", fields: [first_name, last_name])
  4. blended("smith", fields: [first_name, last_name])
  5. )

很显然该词条在title字段的倒排索引中并不存在,因此永远不可能被找到。在multi_match查询中避免使用not_analyzed字段。