【问题标题】:How to include partially-matched results in a cross-fields query?如何在跨字段查询中包含部分匹配的结果?
【发布时间】:2018-11-26 11:45:34
【问题描述】:

我正在使用 Elasticsearch 6.2 构建 cross-fields search。我在弄清楚如何处理我的任期内的部分匹配时遇到问题。

我的查询:

{
   "index":"course",
   "type":"course",
   "body":{
      "query":{
         "bool":{
            "must":{
               "multi_match":{
                  "query":"macroeconomics",
                  "fields":[
                     "course_name",
                     "course_number",
                     "university_name"
                  ],
                  "type":"cross_fields"
               }
            }
         }
      },
      "sort":[
         {
            "_score":"desc"
         },
         {
            "students":{
               "order":"desc"
            }
         }
      ],
      "from":0,
      "size":50
   }
}

查询返回的结果与跨字段模式下的macroeconomics 搜索词完全匹配。

问题是,只要我将搜索词更改为 macro,我就会得到一些仅与 macro 词(完全匹配)相关的结果,而我的 预期结果将包括:

  • macro 术语的任何结果(作为完全匹配),加上
  • macro 术语的任何结果(作为部分匹配),例如在 “宏观经济学”

我知道使用通配符会影响性能,因此这不是最佳方式。

如何调整我的查询以获得如上所述的预期结果?这不仅仅是将“宏”视为前缀,而是将其视为其他结果中可用的潜在子字符串。

【问题讨论】:

标签: elasticsearch elasticsearch-6


【解决方案1】:

基本上,您需要创建一个自定义分析器。参考请查看link

如果你只是想试一试。 要设置 NGram Tokenizer,我们应该声明如下:

  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer",
          "filter": [
            "lowercase"
          ]
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 3,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  }

"my_analyzer" 是我们将用于 ngram 字段的分析器名称 然后对于您的映射,您需要将分析器映射到字段

 "mappings": {
    "_doc": {
      "properties": {
        "course_name": {
          "type": "text",
          "analyzer": "my_analyzer"
        }
    }
    ...

只需将分析器添加到您想要的字段中

更新 验证您的分析仪

GET yourindexname/_analyze 
{
  "analyzer": "my_analyzer", 
  "text":     "macroeconomics"
}

我经常看到的另一个是,

"min_gram" : "3",
"max_gram" : "8"

但这一切都取决于您的用例。

【讨论】:

  • 您好,感谢您的回答。在您使用的tokenizer 配置中,您将 min 和 max_gram 设置为 3。这意味着在我的情况下,“宏观经济学”的标记将如下所示:mac、cro、oec、con、nom、mic。如您所见,我感兴趣的部分“宏”不存在,这可能意味着找不到它。正确的?如果是真的,我需要将 4 的值用于 min 和 max_gram 属性——然后我会丢失任何 3 个字母的部分。这似乎是任意的,因为我希望 any 部分匹配。例如。 “你”应该找到“youtube”; “un”应该找到“unify”等。
  • @lesssugar,是的,你是对的。在我的案例 3 中,3 没问题。事实上,这种组合一直对我有用。但我通常会使用 _analyze api 分析令牌。您可能需要尝试正确的 min_gram 和 max_gram ngram 值。
猜你喜欢
  • 1970-01-01
  • 2023-04-05
  • 2011-07-06
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多