例如,我有两个字段的实体 - 文本和日期。我希望按实体搜索结果按日期排序。但如果我这样做,那么结果是出乎意料的。
对于搜索查询“Iphone 6”,最新的文本只有“6”在结果的顶部,而不是“iphone 6”。没有排序,结果看起来不错,但没有按照我想要的日期排序。
如何编写自定义排序函数,同时考虑相关性和日期?或者可能存在给予评分时考虑的日期权重的方式?
另外,我可能只想用“6”来抑制搜索结果。如何自定义搜索以仅通过bigrams查找结果?
答案 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排序模式。例如,你可以排序 使用上述查询在每个日期字段中的最早日期。
答案 3 :(得分:0)
解决方案是同时使用_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"
}
查询相关性和基于日期的排序:
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
一旦您解决了相关性问题,排序就可以正常进行。