ElasticSearch查询中的精确匹配

o3imoua4  于 2023-01-29  发布在  ElasticSearch
关注(0)|答案(4)|浏览(367)

我想精确匹配message字段中的字符串":Feed:",然后返回一天,拉取所有这样的记录。我的json似乎也匹配普通单词" feed "。我不确定我哪里出错了。我是否需要将"constant_score"添加到这个查询JSON中?我目前拥有的JSON如下所示:

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

svmlkihl1#

如下所述:Finding Exact Values,因为字段在索引时已被分析-您无法精确匹配其标记(“:“)。只要标记应该是可搜索的,Map就应该是“not_analyzed”,并且数据需要重新索引。
如果您希望能够轻松地只匹配消息字段中的“:feed:“,那么您可能需要定制一个不会标记“:“的分析器,这样您就能够使用简单的“match”查询而不是通配符来查询字段。

siotufzp

siotufzp2#

query_string中无法做到这一点,但通过创建一个自定义规范化器,然后使用“match”或“term”查询可以做到这一点。
以下步骤对我很有效。
1.创建一个自定义规范器(可用〉V5.2)

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

}
1.创建类型为“keyword”的Map

{
  "mappings": {
    "default": {
      "properties": {
        "title": {
          "type": "text",
          "fields": {
            "normalize": {
              "type": "keyword",
              "normalizer": "my_normalizer"
            },
            "keyword" : {
              "type": "keyword"
            }
          }
        }
      }
    }
  }

1.使用匹配或术语查询

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

kdfy810k3#

使用匹配短语

GET /_search
{
    "query": {
        "match_phrase": {
            "message": "7000-8900"
        }
    }
}

在Java中使用QueryBuilder中的匹配短语查询

QueryBuilders.matchPhraseQuery(fieldName, searchText);
sycxhyv7

sycxhyv74#

  • 简单甜美的溶液:
  • 使用term查询..
GET /_search
{
    "query": {
        "term": {
            "message.keyword": "7000-8900"
        }
    }
}
  • 使用term查询而不是match_phrase
  • match_phrase此查找/匹配与ES文档存储的句子,它不会完全匹配。它与那些句子单词匹配!

相关问题