首页 > 解决方案 > 需要知道如何在elasticsearch中搜索同一字段中的多个关键字

问题描述

我正在努力在同一字段中搜索多个关键字。我发现了通配符查询,但它需要很长时间或有时会使我的服务器崩溃。

消息:嗨 abc,您的代码是 56712386

{ "query": { "wildcard": { "message" : "*abc*123" } } }

我需要一些能立即产生结果而不浪费时间或利用完整资源的东西。

标签: elasticsearch

解决方案


您正在寻找两件事。

  • 只搜索单词的一部分
  • 搜索多个单词

在我继续解释它是如何完成的之前,您可能想了解 elasticsearch 在内部是如何工作的。

Elasticsearch 会将(字段的)句子分解为标记并将这些标记存储在倒排索引中。这个过程称为分析

所以现在无论你有什么查询,它只有在你正在搜索的标记在倒排索引中可用时才有效。

基本上,这一切都归结为倒排索引中存储了哪些令牌。

现在从实现的角度来看,Elasticsearch使用分析器实现了分析的概念。我建议您开始阅读链接以更好地理解。

为了简单起见,我只提一下,为了搜索单词的一部分,您可能希望使用NGram Tokens are 创建一个自定义分析器。

我已经提到了该链接,以便您可以参考它来了解它是什么。

对于您在问题中提到的文档,我创建了一个示例映射和查询以获取您要查找的内容:

映射:

PUT myindex
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 4,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "message":{
        "type": "text",
        "analyzer": "my_analyzer"
      }
    }
  }
}

样本文件:

POST myindex/_doc/1
{
  "message": "Hi abc, your code is 56712386"
}

查询请求:

使用查询字符串

POST myindex/_search
{
  "query": {
    "query_string": {
      "default_field": "message",
      "query": "abc AND 123"
    }
  }
}

使用布尔查询

POST myindex/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "message": "abc"
          }
        },
        {
          "match": {
            "message": "123"
          }
        }
      ]
    }
  }
}

请注意我是如何使用上述查询的。在查询字符串中,您可以使用 bool 运算符搜索多个单词ANDOR而在 Bool 查询中,您可以使用mustandshould这就像逻辑 AND 和逻辑 OR。

希望这可以帮助!


推荐阅读