具有优先级和部分单词搜索的 ElasticSearch 复杂查询

问题描述 投票:0回答:1

假设我有字段名称“id”、“nm”、“limit”、“description”、“la”

所有字段均为多字段,其中主字段为TEXT,KEYWORD后缀为“ke”。小写规范化器是在 KEYWORD 字段类型上实现的。

现在的要求是,我必须提供“nm”上的搜索功能。如果用户搜索文本字符串,则字符串中的确切单词应优先并首先显示。结果集还应该包含单词的数据,其中搜索字符串中的任何单词都可用,即使是部分单词。 例子 : 数据集:

  1. 你好,我是 Rishabh Kabra
  2. 哇!我正在使用 Elasticsearch
  3. 嘿...你在吗?
  4. 让我们为功能青年而努力吧

示例1: 搜索字符串:哇!我是 预期结果:

  1. 哇!我正在使用 Elasticsearch
  2. 你好,我是 Rishabh Kabra
  3. 让我们为功能青年而努力吧

说明:1. 将优先,因为它具有精确的搜索字符串“哇!我是” 2. 它将排在第二位,因为它有部分精确的字符串“I am” 3. 优先级最低,但在结果集中,因为部分单词功能,因为它具有来自搜索字符串的“i”。

示例2: 搜索字符串:你是吗 预期结果:

  1. 嘿...你在吗?
  2. 让我们为功能青年而努力吧

说明:

  1. 将优先,因为它具有精确的部分搜索“are you”字符串
  2. 会出现结果,因为“青春”中有部分“你”字

我需要弹性查询来满足这个需求。

我尝试过使用 boost 的 function_score ,但它不适用于特殊字符。我将精确单词搜索与通配符结合起来,有时有效,有时无效

java elasticsearch
1个回答
0
投票

尝试这个查询。这应该可以解决您的问题

{
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "should": [
            {
              "match_phrase": {
                "nm.ke": {
                  "query": "wow! I am",
                  "boost": 5         // Highest priority for exact phrase
                }
              }
            },
            {
              "match_phrase": {
                "nm": {
                  "query": "wow! I am",
                  "boost": 3         // Boost for exact partial phrase match in text
                }
              }
            },
            {
              "multi_match": {
                "query": "wow! I am",
                "fields": ["nm^2", "nm.ke^4"],  // Prioritize keyword field
                "type": "phrase_prefix",        // Match partial phrases
                "boost": 2                      // Lower boost for prefix matches
              }
            },
            {
              "multi_match": {
                "query": "wow! I am",
                "fields": ["nm^1.5", "nm.ke^3"], // Match individual words in text/keyword
                "type": "best_fields",           // Default type for word match
                "fuzziness": "AUTO",             // Allow for typos in search terms
                "boost": 1                       // Lowest priority for partial words
              }
            }
          ]
        }
      },
      "score_mode": "sum"  // Combine all scores
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.