Elasticsearch匹配确切的术语

时间:2016-05-30 16:05:57

标签: elasticsearch repository

我有一个Elasticsearch仓库和一个应用程序,可以为我们称之为“资产”的文档创建文档。我需要阻止用户创建资产'使用相同的标题'。

当用户尝试创建'资产'我正在查询带有标题的回购,如果匹配则会向用户显示错误消息。

我的问题是,当我查询标题时,我会得到多个结果(类似的匹配)。

这是我目前的查询:

GET assets-1/asset/_search
{
  "query": {
    "match": {
      "title": {
        "query": "test",
        "operator": "and"
      }
    }
  }
}

我有许多标题记录:'测试1','测试2','测试bla'并且只有一个标题为' test'。

但我得到了以上所有内容。

我是否需要在查询中添加任何条件或属性,以便与术语完全匹配?

1 个答案:

答案 0 :(得分:0)

您的标题字段可能已经过分析,因此test标记将匹配包含该标记的任何标题。

要实现完全匹配,您需要拥有not_analyzed字段并对其进行term查询。

您需要将title字段的映射更改为:

curl -XPUT localhost:9200/assets-1/_mapping/asset -d '{
   "asset": {
      "properties": {
         "title": {
            "type": "string",
            "fields": {
               "raw": {
                   "type": "string",
                   "index": "not_analyzed"
               }
            }
         }
      }
   }
}'

然后您需要重新索引数据,然后您就可以运行完全匹配的查询:

curl -XPOST localhost:9200/assets-1/asset/_search -d '{
   "query": {
      "term": {
         "title.raw": "test"
      }
   }
}'