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

时间:2014-09-22 13:50:42

标签: elasticsearch

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

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

5 个答案:

答案 0 :(得分:11)

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

{
  "query": {
    "bool": {
      "must": {
        "match": {
          "field": "iphone 6"
        }
      }
    }
  },
  "sort": {
    "date": {
      "order": "desc"
    }
  }
}

或者使用您的查询,您也可以使用更合适的方式来做我猜...

只需将其添加为排序

"sort": [
        { "date":   { "order": "desc" }},
        { "_score": { "order": "desc" }}
    ]

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

答案 1 :(得分:0)

你绝对可以使用phrase matching query。 它具有位置感知匹配功能,因此只有当搜索字段中出现“iphone”和“6”并且它们的出现符合此顺序时,文档才会被视为与您的查询匹配,“iphone”出现在“6”之前。

答案 2 :(得分:0)

看起来您希望先按相关性排序,然后按日期排序。这个查询就可以了。

 { "query" : {
     "match" : {
        "my_field" : "my query"   
      }
   },
  "sort": {
     "pubDate": {
        "order": "desc",
        "mode":  "min"
      }
  }
}
  

在具有多个值的字段上排序时,请记住   价值观没有任何内在秩序;多值字段只是一个   一袋价值观。你选择哪一个?对于数字和   日期,您可以通过使用将多值字段减少为单个值   min,max,avg或sum排序模式。例如,你可以排序   使用上述查询在每个日期字段中的最早日期。

elasticsearch guide sorting

答案 3 :(得分:0)

解决方案是同时使用_scoredate字段。 _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"
}

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

POST ecommerce/prododuct/_search
{
    "query": {
        "match": {
           "name": "iphone 6"
        }
    },
    "sort": [
       {
          "_score": {
             "order": "desc"
          }
       },
       {
           "date": {
             "order": "desc"
          }
       }
    ]
}

答案 4 :(得分:0)

我认为您的相关性已被破坏。您应该使用两种不同的分析器,一种用于设置索引,另一种用于搜索。像这样:

PUT /my_index/my_type/_mapping
{
    "my_type": {
        "properties": {
            "name": {
                "type":            "string",
                "analyzer":  "autocomplete", 
                "search_analyzer": "standard" 
            }
        }
    }

您还可以在此处阅读有关此内容的更多信息:https://www.elastic.co/guide/en/elasticsearch/guide/master/_index_time_search_as_you_type.html

一旦您解决了相关性问题,排序就可以正常进行。

相关问题