在 Elasticsearch 中搜索包含 "not" 关键字的字符串

Search in Elasticsearch for a string containing the "not" keyword

我在 AWS(7.9 版)上使用 ElasticSearch,我试图区分两个字符串。

我的主要目标是将搜索结果拆分为“找到”和“未找到”。

一般问题是如何搜索“not”关键字。

您可以在下面看到两个示例消息。

 "CachingServiceOne:Found in cache - Retrieve."
 "CachingServiceThree:Not found in cache - Create new."

您可以使用 ngram tokenizer,在 "title" 字段上搜索 "not"

添加包含索引数据、映射、搜索查询和搜索结果的工作示例

索引映射:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 5,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    },
    "max_ngram_diff": 10
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "my_analyzer"
      }
    }
  }
}

索引数据:

{
    "title":"CachingServiceThree:Not found in cache - Create new."
}
{
    "title":"CachingServiceOne:Found in cache - Retrieve."
}

搜索查询:

{
  "query":{
    "match":{
      "title":"Not"
    }
  }
}

搜索结果:

"hits": [
      {
        "_index": "67093372",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.6720003,
        "_source": {
          "title": "CachingServiceThree:Not found in cache - Create new."
        }
      }
    ]

好吧,问题似乎确实出在默认分析器的工作方式上,而不是我无法搜索 not 这个词。这就是为什么我接受了答案。但我想补充一点。为了简单起见。

  1. 默认分析器不在 : 上拆分单词。

  2. 也就是说,我们要搜索title:CachingServiceThree\:Not.

  3. 其中title为字段名,:必须转义\:.

诀窍是 title:*\:Nottitle:*\:Found 使用 KQL 语法。

使用 wildcard 成功获取所有内容。我想知道使用所有实际值的数组是否会更快。

通过检查面板翻译成:

{
  "query": {
    "bool": {
      "filter": [
        {
          "bool": {
            "should": [
              {
                "query_string": {
                  "fields": [
                    "title"
                  ],
                  "query": "*\:Not"
                }
              }
            ],
            "minimum_should_match": 1
          }
        }
      ]
    }
 }
}