【问题标题】:Implementing priority search in elastic search在弹性搜索中实现优先搜索
【发布时间】:2019-11-21 20:26:48
【问题描述】:

我正在尝试在弹性搜索中实现自定义搜索。

问题陈述是考虑将 3 个文档插入到弹性搜索中,其中“名称”字段作为数组:

{
   id:1,
   names:["John Wick","Iron man"]
}
{
   id:2,
   names:["Wick Stone","Nick John"]
}
{
   id:3,
   names:["Manny Nick","Stone cold"]
}

当我搜索“Nick”时,我想提升或优先考虑以 Nick 开头的文档,因此在这种情况下,id 为 2 的文档应该先出现,然后是 id 为 3 的文档,如果我搜索全名“Manny Nick” " id 为 3 的文档应优先考虑。

【问题讨论】:

    标签: java elasticsearch lucene logstash kibana


    【解决方案1】:

    在这种情况下,您可能需要修改/提高所需条件的搜索匹配结果的分数。例如,匹配名称为"Nick"的文档,同时修改并提升包含names且以Nick开头的文档的分数,以便匹配Nick且也以Nick开头的文档将有更高的分数

    实现此目的的方法之一是使用Function Score Query. 在下面的查询中,搜索关键字“Nick”并使用Match Phrase Prefix Query 修改并提升匹配文档的分数以符合条件“以 Nick 开头的名称”额外重量20。

    {
      "query": {
        "function_score": {
          "query": {
            "match": {
              "names": "Nick"
            }
          },
          "boost": "1",
          "functions": [
            {
              "filter": {
                "match_phrase_prefix": {
                  "names": "Nick"
                }
              },
              "weight": 20
            }
          ],
          "boost_mode": "sum"
        }
      }
    }
    

    测试:

    插入数据:

    {
       id:1,
       names:["John Wick","Iron man"]
    }
    {
       id:2,
       names:["Wick Stone","Nick John"]
    }
    {
       id:3,
       names:["Manny Nick","Stone cold"]
    }
    

    输出:

    {
        "took": 10,
        "timed_out": false,
        "_shards": {
            "total": 5,
            "successful": 5,
            "skipped": 0,
            "failed": 0
        },
        "hits": {
            "total": 2,
            "max_score": 20.693148,
            "hits": [
                {
                    "_index": "stack_1",
                    "_type": "1",
                    "_id": "T9kn5WsBrk7qsVCmKBGH",
                    "_score": 20.693148,
                    "_source": {
                        "id": 2,
                        "names": [
                            "Wick Stone",
                            "Nick John"
                        ]
                    }
                },
                {
                    "_index": "stack_1",
                    "_type": "1",
                    "_id": "Ttkm5WsBrk7qsVCm2RF_",
                    "_score": 20.287682,
                    "_source": {
                        "id": 3,
                        "names": [
                            "Manny Nick",
                            "Stone cold"
                        ]
                    }
                }
            ]
        }
    }
    

    【讨论】:

    • 感谢您的回答。会试一试
    • 似乎无法正常工作,我在两条记录的屏幕截图中获得相同的分数以供参考i.stack.imgur.com/NkyEM.png
    • 我需要更改任何设置或映射来处理数组@ra-ka
    • @user3863788 我已经在默认映射设置中进行了测试,我得到了正确的结果。所以,我想您不需要更改数组映射中的任何内容,因为它只是 String 类型(如果它是对象类型,您必须这样做)。我只是插入了您提供的测试数据并使用上述查询进行了测试,并且我得到了正确的结果。我将更新我所做测试的答案。
    • 我认为弹性搜索会保存这样的名称字段。对于 id 2 名称的文档:Wick Stone Nick John 和文档 3 名称:Manny Nick Stone 冷所以我需要的是当我搜索“Nick”时,我想提升 id 为 2 的文档,因为“Nick john”是一个人的全名,它以“Nick”开头,同时我不想忽略 id 为 3 的文档,因为它包含“Nick”@ra-ka
    猜你喜欢
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 2020-07-09
    • 2022-06-18
    相关资源
    最近更新 更多