根据 Elasticsearch 中的字段值对记录进行排名

问题描述

我在记录架构中有一个字段 distribution,如下所示:

...
"distribution": {
    "properties": {
        "availability": {
            "type": "keyword"
         } 
     }
}
...

我想对 distribution.availability == "ondemand" 的记录进行排名低于其他记录。

我查看了 Elasticsearch docs,但找不到一种方法来降低 索引时间 中此类记录的分数,以使其在搜索结果显示得更低。

我怎样才能做到这一点,任何指向相关来源的指针也足够了。

更多信息:

我在查询时间的python客户端的帮助下完全省略了这些ondemand记录,如下所示:

from elasticsearch_dsl.query import Q

_query = Q("query_string",query=query_string) & ~Q('match',**{'availability.keyword': 'ondemand'})

现在,我想包括这些记录,但我想将它们放在低于其他记录的位置。

如果无法在 index-time 中实现这样的功能,请建议我如何在 query-time 中使用 python 客户端实现这一点。

应用 llermaly 的建议后,python 客户端查询如下所示:

boosting_query = Q(
    "boosting",positive=Q("match_all"),negative=Q(
        "bool",filter=[Q({"term": {"distribution.availability.keyword": "ondemand"}})]
    ),negative_boost=0.5,)
if query_string:
    _query = Q("query_string",query=query_string) & boosting_query
else:
    _query = Q() & boosting_query

解决方法

EDIT2elasticsearch-dsl-py 版本的 boosting 查询

from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search
from elasticsearch_dsl import Q

client = Elasticsearch()
q = Q('boosting',positive=Q("match_all"),negative=Q('bool',filter=[Q({"term": {"test.available.keyword": "ondemand"}})]),negative_boost=0.5)
s = Search(using=client,index="test_parths007").query(q)

response = s.execute()
print(response)
for hit in response:
    print(hit.meta.score,hit.test.available)

EDIT :只要阅读你需要在索引时间做它。

Elasticsearch 在 5.0 上弃用了索引时间提升 https://www.elastic.co/guide/en/elasticsearch/reference/7.11/mapping-boost.html

您可以使用 Boosting query 在查询时实现这一点。

提取文档

POST test_parths007/_doc
{
  "name": "doc1","test": {
    "available": "ondemand"
  }
}

POST test_parths007/_doc
{
  "name": "doc1","test": {
    "available": "higherscore"
  }
}

POST test_parths007/_doc
{
  "name": "doc2","test": {
    "available": "higherscore"
  }
}

查询(索引时间)

POST test_parths007/_search
{
  "query": {
    "boosting": {
      "positive": {
        "match_all": {}
      },"negative": {
        "term": {
          "test.available.keyword": "ondemand"
        }
      },"negative_boost": 0.5
    }
  }
}

回复

{
  "took" : 0,"timed_out" : false,"_shards" : {
    "total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0
  },"hits" : {
    "total" : {
      "value" : 3,"relation" : "eq"
    },"max_score" : 1.0,"hits" : [
      {
        "_index" : "test_parths007","_type" : "_doc","_id" : "VMdY7XcB50NMsuQPelRx","_score" : 1.0,"_source" : {
          "name" : "doc2","test" : {
            "available" : "higherscore"
          }
        }
      },{
        "_index" : "test_parths007","_id" : "Vcda7XcB50NMsuQPiVRB","_source" : {
          "name" : "doc1","_id" : "U8dY7XcB50NMsuQPdlTo","_score" : 0.5,"test" : {
            "available" : "ondemand"
          }
        }
      }
    ]
  }
}

有关更高级的操作,您可以查看 Function Score Query

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...