【问题标题】:Elastic Search match phrase query -> output not predictable弹性搜索匹配短语查询 -> 输出不可预测
【发布时间】:2020-03-29 06:55:44
【问题描述】:

示例文档

{
  "id": 5,
  "title": "Quick Brown fox jumps over the lazy dog",
  "genre": [
    "fiction"
  ]
}

映射

{
  "movies" : {
    "mappings" : {
      "properties" : {
        "genre" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "id" : {
          "type" : "long"
        },
        "title" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

查询 1: 之前共享的文档中的结果

{
 "query": {
   "match_phrase": {
     "title": {
       "query": "fox quick over", "slop": 3
     }
   }
 } 
}

查询 2: 没有结果

{
 "query": {
   "match_phrase": {
     "title": {
       "query": "over fox quick", "slop": 3
     }
   }
 } 
}

我期待查询 2 中的结果,而不是查询 1 中的结果。

【问题讨论】:

  • 也请分享您的索引映射。调试查询会更容易。
  • @Harshit:嘿...添加了映射。谢谢

标签: elasticsearch elasticsearch-query phrase


【解决方案1】:

斜率

为了使查询和文档匹配,您需要移动术语的次数。

切换词序需要两个编辑/步骤

下面是词的移动

查询 1:

位置 1 位置 2 位置 3 位置 4 位置 5 位置 6 位置 7 位置 8 -------------------------------------------------- ---------------------------------- 医生:敏捷的棕狐跳过懒狗 -------------------------------------------------- ------------------------------------- 查询:狐狸快过来 Slop 1:狐狸|快过去 Slop 2:快速解决问题 Slop 3:快速解决问题

总步骤 3

查询 2:

位置 1 位置 2 位置 3 位置 4 位置 5 位置 6 位置 7 位置 8 -------------------------------------------------- ---------------------------------- 医生:敏捷的棕狐跳过懒狗 -------------------------------------------------- ------------------------------------- 查询:过狐狸快 Slop 1: over fox|quick Slop 2: quick|over 狐狸 Slop 3:快过狐狸 Slop 4: quick over|狐狸 Slop 5:快速解决问题 Slop 6:快速解决问题

总步骤 6

【讨论】:

  • 感谢您的回答
【解决方案2】:

因此,我使用您提供的映射重现了该问题,并且能够在 Explain APIthis 有关 match_phrase 查询中 slop 的文章的帮助下解决该问题。

因此,当我的搜索结果中显示最小 slop of 6 时,您的第二个查询会给出结果。

搜索查询

{
 "query": {
   "match_phrase": {
     "title": {
       "query": "over fox quick", "slop": 6 --> note 6
     }
   }
 } 
}

同样,您需要提供minimum slop of 3 才能从您的第一个查询中获得搜索结果。

基本上是斜率值的意思,可配置项的允许偏差。

示例:- 您的文档包含 Quick Brown fox jumps over the lazy dog

Quick
Brown
fox
jumps
over
the
lazy 
dog

如果您要搜索 fox quick over 作为一个短语,它们都需要放在一起,为此您需要重新排列上述标记。

最少需要更换 3 个,如下所示:

foxover 无需更改任何内容,因为它们已经正常,quick 需要进行 3 次替换,才能到达正确的位置。

使用相同的方法,您可以弄清楚为什么在第二个查询中需要六个 slop 才能工作。

【讨论】:

  • 感谢您的回答:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 2021-08-06
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多