首页 > 解决方案 > 处理同一搜索字符串上的精确搜索和部分搜索

问题描述

我想定义可以处理相同搜索值的部分搜索和精确搜索的模式。

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

标签: elasticsearch

解决方案


对于属性的部分匹配数据类型应该是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),因为一个标记 ieNishant出现在 field 的两个文档中name

对于精确搜索,我们需要在name.keyword. 要执行完全匹配,我们可以使用术语查询,如下所示:

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

这将仅匹配 doc 1。


推荐阅读