elasticsearch 6.8不会先按精确匹配排序

30byixjq  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(1)|浏览(366)

我已经找了好几天这类问题,但都没能解决。我遵循这样这样的步骤,但没有成功。
基本上,我有以下关于elasticsearch的数据:

{ title: "Black Dust" },
{ title: "Dust In The Wind" },
{ title: "Gold Dust Woman" },
{ title: "Another One Bites The Dust" }

问题是我想用“灰尘”这个词来搜索结果,我希望结果的顺序如下:

{ title: "Dust In The Wind" },
{ title: "Black Dust" },
{ title: "Gold Dust Woman" },
{ title: "Another One Bites The Dust" }

其中“灰尘”必须出现在结果的顶部。
发布Map和查询比继续解释问题本身要好。

settings: {
      analysis: {
        normalizer: {
          lowercase: {
            type: 'custom',
            filter: ['lowercase']
          }
        }
      }
    },
    mappings: {
      _doc: {
        properties: {
          title: {
            type: 'text',
            analyzer: 'standard',
            fields: {
              raw: {
                type: 'keyword',
                normalizer: 'lowercase'
              },
              fuzzy: {
                type: 'text',
              },
            },
          }
        }
      }
    }

我的问题是:

"query": {
    "bool": {
      "must": {
        "query_string": {
          "fields": [
            "title"
          ],
          "default_operator": "AND",
          "query": "dust"
        }
      },
      "should": {
        "prefix": {
          "title.raw": "dust"
        }
      }
    }
  }

有人能帮我吗?谢谢您!
解决方案!
我找到了答案,通过执行以下查询解决了问题:

"query": {
    "bool": {
      "must": {
        "bool": {
          "should": [
            {
              "prefix": {
                "title.raw": {
                  "value": "dust",
                  "boost": 1000000
                }
              }
            },
            {
              "match": {
                "title": {
                  "query": "dust",
                  "boost": 50000
                }
              }
            },
            {
              "match": {
                "title": {
                  "query": "dust",
                  "boost": 10,
                  "fuzziness": 1
                }
              }
            }
          ]
        }
      }
    }
  }

然而,在编写测试时,我发现了一个小问题。所以,我生成了一个随机变量 uuid 并将以下内容添加到数据库中:

{ title: `${uuid} A` }
{ title: `${uuid} W` }
{ title: `${uuid} Z` }
{ title: `A ${uuid}` }
{ title: `z ${uuid}` }
{ title: `Z ${uuid}` }

当我执行上面的查询查找 uuid ,我得到:

uuid Z
uuid A
uuid W
Z uuid

我的第一个目标就是 uuid 在第一个位置,但为什么z在a之前(第一和第二个结果)

b91juud3

b91juud31#

当其他所有操作都失败时,可以使用一个普通的子字符串位置排序,如下所示:

{
  "query": {
    "bool": {
      "must": {
       ...
      },
      "should": {
        ...
      }
    }
  },
  "sort": [
    {
      "_script": {
        "script": "return doc['title.raw'].value.indexOf('dust')",
        "type": "number",
        "order": "asc"     <--
      }
    }
  ]
}

我已经下了命令 asc 因为子串索引越低,“分数”就越高。
编辑
我们得解释一下 index == -1 因此,将上面的脚本替换为:

"script": "def pos = doc['title.raw'].value.indexOf('dust'); return pos == -1 ? Integer.MAX_VALUE : pos"

相关问题