【问题标题】:Search in Elasticsearch for a string containing the "not" keyword在 Elasticsearch 中搜索包含“not”关键字的字符串
【发布时间】:2021-07-09 14:23:25
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: elasticsearch lucene kibana


    【解决方案1】:

    您可以使用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."
            }
          }
        ]
    

    【讨论】:

    • 嗯,那肯定行得通。以为我错过了什么。一个后续问题,如果可以的话。编写自己的分析器是常见的做法吗?并不是说它们会产生太多开销。
    • @cr3a7ure 如果没有指定分析器,elasticsearch 使用标准分析器。因此,如果您有特定的用例,则需要定义自己的自定义分析仪。
    【解决方案2】:

    好吧,问题似乎确实是默认分析器的工作方式,而不是我无法搜索 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
              }
            }
          ]
        }
     }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-23
      • 1970-01-01
      • 2013-04-09
      • 2011-05-25
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 2021-09-27
      相关资源
      最近更新 更多