【问题标题】:Elastic search - query-string - return result based on custom order弹性搜索 - 查询字符串 - 根据自定义订单返回结果
【发布时间】:2020-10-14 22:37:58
【问题描述】:

当搜索关键字超过一个时,以下搜索查询结果按顺序提供数据。

{
"query": {
    "query_string" : {
        "query" : "(Sony Music) OR (Sony Music*) OR (*Sony Music) OR (*Sony Music*)",
        "fields" : ["MDMGlobalData.Name1"]
    }
}

}

  1. 精确匹配优先。
  2. 然后,显示以搜索词开头的那些。
  3. 然后,显示以搜索词结尾的内容。
  4. 然后,显示剩余部分。

但如果只是一个词,请在查询数据中说sony。顺序乱了。

有人请告诉我为什么会这样?以及使用query-string 搜索获得上述排序结果的最佳方法是什么。

【问题讨论】:

  • 提到的字段的映射是什么,并添加一些示例值
  • @Iniamudhan 已经很久了。您有机会阅读我的回答吗,期待您的反馈,如果有帮助,请不要忘记投票并接受 :)
  • @BhavyaGupta 对于大量数据,您的答案没有按预期工作。所以我们使用自定义函数分数来说明我们的逻辑
  • 哦好的@Iniamudhan,谢谢你的回复:)

标签: elasticsearch


【解决方案1】:

当你只查询sony时,它应该有最低分。这不是你所期望的吗?默认情况下,查询字符串似乎确实考虑了OR 子句的顺序,所以我想说你的已经很优化了。

您是否尝试过修改default_operator 选项?

另外,sony“在查询数据中”是什么意思?查询字符串本身或字段MDMGlobalData.Name1sony 的文档?

【讨论】:

  • 我的意思是,查询看起来像 "query" : "(Sony) OR (Sony*) OR (*Sony) OR (*Sony*)"
【解决方案2】:

但如果只是一个词,在查询数据中说索尼。顺序乱了 起来。

根据您的上述陈述和您在上述答案中提到的评论

添加带有示例文档和搜索查询的工作示例

索引样本数据:

{
    "MDMGlobalData":{
        "name":"Sony Music"
    }
}
{
    "MDMGlobalData":{
        "name":"Sony Music Corp"
    }
}
{
    "MDMGlobalData":{
        "name":"All Sony Music Corp"
    }
}
{
    "MDMGlobalData":{
        "name":"Sony"
    }
}

搜索查询:

{
  "query": {
    "query_string": {
      "query": "(Sony) OR (Sony*) OR (*Sony) OR (*Sony*)",
      "fields": [
        "MDMGlobalData.name"
      ]
    }
  }
}

搜索结果:

"hits": [
        {
            "_index": "foo1",
            "_type": "_doc",
            "_id": "4",
            "_score": 3.1396344,
            "_source": {
                "MDMGlobalData": {
                    "name": "Sony"
                }
            }
        },
        {
            "_index": "foo1",
            "_type": "_doc",
            "_id": "1",
            "_score": 3.114749,
            "_source": {
                "MDMGlobalData": {
                    "name": "Sony Music"
                }
            }
        },
        {
            "_index": "foo1",
            "_type": "_doc",
            "_id": "2",
            "_score": 3.097392,
            "_source": {
                "MDMGlobalData": {
                    "name": "Sony Music Corp"
                }
            }
        },
        {
            "_index": "foo1",
            "_type": "_doc",
            "_id": "3",
            "_score": 3.084596,
            "_source": {
                "MDMGlobalData": {
                    "name": "All Sony Music Corp"
                }
            }
        }
    ]

如您所见,顺序仍然保持不变,Sony 得分最高(应该根据所进行的查询),然后根据 OR 子句的顺序进行进一步评分.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-24
    • 2021-02-10
    • 2016-07-28
    • 2016-08-05
    • 2019-07-20
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    相关资源
    最近更新 更多