执行关键字搜索的正确方法是什么?

What's the right way to perform a keyword search?

如果我想执行 keyword search using a TermQuery,正确的方法是什么?我应该在我的字段名称前加上 ".keyword" 吗?我认为有一种更优先 class 公民的方式来做这件事! ‍♂️

QueryBuilders.termQuery(SOME_FIELD_NAME + ".keyword", someValue)

这一切都归结为您的映射。如果您的字段被映射为 'straightforward' keyword 像这样

{
  "mappings": {
    "properties": {
      "some_field": {
        "type": "keyword"
      }
    }
  }
}

您不需要附加 .keyword -- 您只需

QueryBuilders.termQuery(SOME_FIELD_NAME, someValue)

不过,最好不要将自己局限于 keywords,尤其是。如果您要进行部分匹配、扩展、自动完成等。

典型的 text 字段映射看起来像

PUT kwds
{
  "mappings": {
    "properties": {
      "some_field": {
        "type": "text",
        "fields": {
          "keyword": {          <---
            "type": "keyword"
          },
          "analyzed": {         <---
            "type": "text",
            "analyzer": "simple"
          },
          "...": {              <---
             ...
          }
        }
      }
    }
  }
}

这意味着您将能够访问同一 "property"(字段)的不同索引的 "versions"(字段)。命名相当混乱,但您明白了要点。

长话短说,这就是 .keyword 约定的来源。如果您的字段已经映射为 keyword.

,则不需要它