如何在跨域查询中包括部分匹配的结果?

时间:2018-11-26 11:45:34

标签: elasticsearch elasticsearch-6

我正在使用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字词的任何结果(作为部分匹配项),例如在 “宏观经济学”

我知道使用通配符会影响性能,所以这不是最佳方法。

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

>

1 个答案:

答案 0 :(得分:0)

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

如果您只想尝试一下。 要设置NGram令牌生成器,我们应声明如下:

  "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"

但这全取决于您的用例。