ElasticSearch - 按相关性和自定义字段(日期)对搜索结果进行排序

raz*_*zon 8 elasticsearch

例如,我有两个字段的实体 - 文本和日期.我希望按实体搜索结果按日期排序.但如果我这样做,那么结果是出乎意料的.
对于搜索查询"Iphone 6",最新的文本只有"6"在结果的顶部,而不是"iphone 6".没有排序,结果似乎很好,但不按我想要的日期排序.
如何编写自定义排序函数,同时考虑相关性和日期?或者可能存在给予场上权重的方式日期将在评分中考虑?

另外,我可能只想用"6"来抑制搜索结果.如何自定义搜索以仅通​​过bigrams查找结果?

小智 13

您是否尝试过这样的bool查询?

{
  "query": {
    "bool": {
      "must": {
        "match": {
          "field": "iphone 6"
        }
      }
    }
  },
  "sort": {
    "date": {
      "order": "desc"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

或者你的查询你也可以用更合适的方式做我猜...

只需将其添加为排序

"sort": [
        { "date":   { "order": "desc" }},
        { "_score": { "order": "desc" }}
    ]
Run Code Online (Sandbox Code Playgroud)

所有匹配的结果首先按日期排序,然后按相关性排序.


Vis*_*kla 5

解决方案是使用_score和date字段都排序。_score作为第一个排序顺序,date字段作为第二个排序顺序。

您可以使用简单的匹配查询来执行相关性匹配。

试试看。

数据设置:

POST ecom/prod
{
    "name":"iphone 6",
    "date":"2019-02-10"
}

POST ecom/prod
{
    "name":"iphone 5",
    "date":"2019-01-10"
}

POST ecom/prod
{
    "name":"iphone 6",
    "date":"2019-02-28"
}

POST ecom/prod
{
    "name":"6",
    "date":"2019-03-01"
}
Run Code Online (Sandbox Code Playgroud)

查询相关性和基于日期的排序:

POST ecommerce/prododuct/_search
{
    "query": {
        "match": {
           "name": "iphone 6"
        }
    },
    "sort": [
       {
          "_score": {
             "order": "desc"
          }
       },
       {
           "date": {
             "order": "desc"
          }
       }
    ]
}
Run Code Online (Sandbox Code Playgroud)