在同一搜索字符串上同时处理完全搜索和部分搜索

时间:2019-02-09 12:14:42

标签: elasticsearch

我想定义一个模式,该模式可以解决相同搜索值的部分搜索和精确搜索。

精确搜索应始终返回“完全匹配”,在这种情况下,ES不应将搜索字符串分成标记。

1 个答案:

答案 0 :(得分:0)

对于部分匹配,属性的数据类型应为text,对于精确匹配,属性的类型应为keyword。为了可以部分搜索和精确搜索,而不必将数据索引到不同的属性,可以使用fields。它的作用是帮助将相同的数据以不同的方式编制索引。

因此,假设您要索引人员的姓名,并具有部分和精确搜索的能力。在这种情况下,映射将为:

PUT test
{
  "mappings": {
    "_doc": {
      "properties": {
        "name": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword"
            }
          }
        }
      }
    }
  }
}

让一些文档编入索引:

PUT test/_doc/1
{
  "name": "Nishant Saini"
}

PUT test/_doc/2
{
  "name": "Nishant Kumar"
}

对于部分搜索,我们必须查询name字段,其类型为text

GET test/_doc/_search
{
  "query": {
    "query_string": {
      "query": "Nishant Saini",
      "field": [
        "name"
      ]
    }
  }
}

上面的查询将返回两个文档(1和2),因为两个令牌中的字段Nishant都出现了一个标记,即name

要进行精确搜索,我们需要在name.keyword上进行查询。要执行完全匹配,我们可以使用以下术语查询:

{
  "query": {
    "term": {
      "name.keyword": "Nishant Saini"
    }
  }
}

这将仅匹配doc 1。