我在这个项目中使用Elasticsearch,但Solr解决方案也可能是合适的。在查询中,我希望包含should
子句的一部分,即使其他任何术语都不能,也会返回结果。这将用于文档流行度。我会定期计算阅读流行度,并使用数值为每个doc添加一个浮动字段。
这个想法是根据术语返回文档,但是当失败时,返回按受欢迎程度排名的流行文档。这些应按术语匹配分数或人气分数的大小排序。
我意识到我可以量化受欢迎程度并将其视为标签"最热门","更热","热" ...但是想要使用数字字段,因为排名已明确定义。
以下是我的数据的当前形式(来自id的获取):
GET /index/docs/ipad
返回一个示例对象
{
"_index": "index",
"_type": "docs",
"_id": "doc1",
"_version": 1,
"found": true,
"_source": {
"category": ["tablets", "electronics"],
"text": ["buy", "an", "ipad"],
"popularity": 0.95347457,
"id": "doc1"
}
}
当前查询格式
POST /index/docs/_search
{
"size": 10,
"query": {
"bool": {
"should": [
{"terms": {"text": ["ipad"]}}
],
"must": [
{"terms": {"category": ["electronics"]}}
]
}
}
}
这似乎是一种奇怪的查询格式,但这些是结构化对象,而不是自由格式文本。
我是否可以为此查询添加热门程度,以便它返回按受欢迎程度排名的项目以及should
条款返回的项目?我将实际条款提升到高于受欢迎程度,以便他们受到青睐。
注意我不希望按受欢迎程度提升,如果查询的其余部分没有返回任何内容,我想返回热门。
答案 0 :(得分:1)
我能想到的一种方法是将match_all filter包裹在constant score中 并使用排序后跟人气
示例:
{
"size": 10,
"query": {
"bool": {
"should": [
{
"terms": {
"text": [
"ipad"
]
}
},
{
"constant_score": {
"filter": {
"match_all": {}
},
"boost": 0
}
}
],
"must": [
{
"terms": {
"category": [
"electronics"
]
}
}
],
"minimum_should_match": 1
}
},
"sort": [
{
"_score": {
"order": "desc"
}
},
{
"popularity": {
"unmapped_type": "double"
}
}
]
}
答案 1 :(得分:0)
您想要查看function score query和衰减函数。