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

Dha*_*esh 9 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"
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Har*_*and 12

使用匹配短语

GET /_search
{
    "query": {
        "match_phrase": {
            "message": "7000-8900"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在java中使用QueryBuilder的matchPhraseQuery

QueryBuilders.matchPhraseQuery(fieldName, searchText);
Run Code Online (Sandbox Code Playgroud)


isr*_*lst 10

如下所述:查找精确值,因为在索引时已分析字段 - 您无法精确匹配其标记(":").每当令牌应该可搜索时,映射应该"未分析"并且数据需要重新编制索引.

如果您希望能够在消息字段中轻松匹配":feed:",则可能需要对未标记":"的分析器进行成本化,以便您可以使用简单的"匹配"查询来查询字段而不是野生人物.


Arv*_*mar 10

无法做到这一点,query_string但设法通过创建自定义规范化器然后使用“匹配”或“术语”查询来做到这一点。

以下步骤对我有用。

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

    "settings": {
     "analysis": {
       "normalizer": {
         "my_normalizer": {
           "type": "custom",
           "filter": ["lowercase"]
         }
       }
     }
    
    Run Code Online (Sandbox Code Playgroud)

    }

  2. 创建一个类型为“keyword”的映射

    {
      "mappings": {
        "default": {
          "properties": {
            "title": {
              "type": "text",
              "fields": {
                "normalize": {
                  "type": "keyword",
                  "normalizer": "my_normalizer"
                },
                "keyword" : {
                  "type": "keyword"
                }
              }
            }
          }
        }
      }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用匹配或术语查询

    {
      "query": {
            "bool": {
              "must": [
               {
                 "match": {
                   "title.normalize": "string to match"
                 }
               }
            ]
          }
        }
      }
    
    Run Code Online (Sandbox Code Playgroud)


Ash*_*gar 7

  • 简单而甜蜜的解决方案:
  • 使用term查询..
GET /_search
{
    "query": {
        "term": {
            "message.keyword": "7000-8900"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 使用term查询代替match_phrase,
  • match_phrase这个find/match与ES-document存储的句子,它不会完全匹配。和那句话很配啊!

  • 这个“解决方案”假设“message”字段与“keyword”字段(=“未分析”)映射,这是ES当前的默认值。但问题中的情况并非如此!问题是关于“分析”字段,因此解决方案只是将该字段重新映射为“关键字”并重新索引。然后,顺便说一句,它也适用于“query_string”,并且它与“term”查询无关......@Midiman,请删除有关当前接受答案的注释,因为它是问题的正确答案。 (3认同)