在弹性搜索中实现优先级搜索

时间:2019-07-12 05:33:49

标签: java elasticsearch lucene logstash kibana

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

问题语句考虑将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的文档应优先考虑。

1 个答案:

答案 0 :(得分:0)

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

其中一种方法是使用Function Score Query. 在以下查询中,搜索关键字“ Nick”,并使用{{3}修改并提高匹配文档的分数,以搜索条件 “以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"
                    ]
                }
            }
        ]
    }
}