弹性搜索查询中的完全匹配

时间:2016-06-18 07:25:57

标签: elasticsearch

我希望与":Feed:"字段中的字符串message完全匹配,并返回所有此类记录。我的json似乎也匹配普通单词" feed "。我不确定我哪里出错了。我是否需要将"constant_score"添加到此查询JSON中?我目前的JSON如下所示:

{
    "query": {
        "bool": {
            "must": {
                "query_string": {
                    "fields": ["message"],
                    "query": "\\:Feed\\:"
                }
            },
            "must": {
                "range": {
                    "timestamp": {
                        "gte": "now-1d",
                        "lte": "now"
                    }
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:9)

如上所述:Finding Exact Values,因为在索引时已对字段进行了分析 - 您无法精确匹配其标记(":")。每当令牌都应该被搜索时,映射应该是" not_analyzed"并且数据需要重新编制索引。

如果您希望能够轻松匹配":Feed:"在消息字段中,您可能希望对没有标记化的分析器进行成本计算:":"这样你就可以用简单的#34;匹配"来查询字段。查询而不是通配符。

答案 1 :(得分:6)

无法通过query_string来执行此操作,但是可以通过创建自定义规范化器,然后使用“ match”或“ term”查询来做到这一点。

以下步骤对我有用。

  1. 创建自定义规范化器(可用> V5.2)

    "settings": {
     "analysis": {
       "normalizer": {
         "my_normalizer": {
           "type": "custom",
           "filter": ["lowercase"]
         }
       }
     }
    

    }

  2. 使用“关键字”类型创建映射

    {
      "mappings": {
        "default": {
          "properties": {
            "title": {
              "type": "text",
              "fields": {
                "normalize": {
                  "type": "keyword",
                  "normalizer": "my_normalizer"
                },
                "keyword" : {
                  "type": "keyword"
                }
              }
            }
          }
        }
      }
    
  3. 使用匹配项或术语查询

    {
      "query": {
            "bool": {
              "must": [
               {
                 "match": {
                   "title.normalize": "string to match"
                 }
               }
            ]
          }
        }
      }