java - 在elasticsearch中实现优先级搜索

标签 java elasticsearch lucene logstash kibana

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

问题陈述是考虑将 3 个文档插入到 Elasticsearch 中,其中“names”字段作为数组:

{
   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 的文档应优先考虑。

最佳答案

在这种情况下,您可能需要修改/提高所需条件的搜索匹配结果的分数。例如,匹配名称为“Nick”的文档,同时修改并提升包含namesNick开头的文档的分数> 这样,匹配 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"
                    ]
                }
            }
        ]
    }
}

关于java - 在elasticsearch中实现优先级搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57000706/

相关文章:

java - 向实体中的实例添加属性

java - KeyEvent.SHIFT_DOWN_MASK 与 KeyEvent.SHIFT_MASK

node.js - 如何检查嵌套对象内是否存在所有值elasticsearch

java - 使用 Elasticsearch 的 Java High Level Rest Client 收到异步请求的响应后立即返回某些内容

elasticsearch - Elasticsearch hunspell过多地削减了单词

java - Apache Lucene 6 QueryParser 范围查询不适用于 IntPoint

elasticsearch - Elasticsearch段建立,堆增加直到崩溃

java - 从命令提示符运行 jar 文件时如何在 log4j.properties 文件中指定日志文件位置

java - JList 使用 HashMap 键(字符串)作为其显示?

java - 如何在 Hibernate Search 中使用通配符和空格搜索字段