首页 > 解决方案 > 在 Elastic Search 中使用通配符进行部分搜索

问题描述

我想使用通配符在弹性搜索中搜索数组值。

在此处输入图像描述

{
    "query": {
        "wildcard": {
            "short_message": {
                "value": "*nne*",
                "boost": 1.0,
                "rewrite": "constant_score"
            }
        }
    }
}

我正在搜索“short_messages”,它对我有用。但我想搜索“messages.message”它不起作用。

{
    "query": {
        "wildcard": {
            "messages.message": {
                "value": "*nne*",
                "boost": 1.0,
                "rewrite": "constant_score"
            }
        }
    }
}

而且我还想在一个数组中搜索多个字段。

例如:- 字段:[“messages.message”,“messages.subject”,“messages.email_search”]

那么就有可能给我最好的解决方案。

提前致谢。

标签: pythondjangoelasticsearch

解决方案


似乎您正在nested使用messages.

您需要为此使用nested query

POST <your_index_name>/_search
{
  "query": {
    "nested": {
      "path": "messages",
      "query": {
        "wildcard": {
          "messages.message": {
            "value": "*nne*",
            "boost": 1
          }
        }
      }
    }
  }
}

对于多字段查询,您可能可以使用它,query_string所以基本上您的解决方案是query_stringnested query.

请求参数:

POST <your_index_name>/_search
{
  "query": {
    "nested": {
      "path": "messages",
      "query": {
        "query_string": {
          "fields": ["messages.message", "messages.subject"],
          "query": "*nne*",
          "boost": 1
        }
      }
    }
  }
}

查询 DSL

您也可以使用wildcardusingQuery DSL但同样,您需要为每个字段添加多个查询子句,出于性能原因,我怀疑通配符查询不支持多字段查询。

POST <your_index_name>/_search
{
  "query": {
    "nested": {
      "path": "messages",
      "query": {
        "bool": {
          "should": [
            {
              "wildcard": { 
                "messages.message": {
                  "value": "*nne*",
                  "boost": 1
                }
              }
            },
            {
              "wildcard": {
                "messages.subject": {
                  "value": "*nne*",
                  "boost": 1
                }
              }
            }
          ]
        }
      }
    }
  }
}

请注意,不建议使用通配符搜索,因为它必须执行的正则表达式操作的数量会影响您获得响应的延迟,相反,我建议您查看Ngram Tokenizer从而您可以使用简单的匹配查询来得到你想要的结果。

让我知道这是否有帮助!


推荐阅读