在OrchardCore中用Query DSL随机选取ContentType条目遇重复结果问题
解决OrchardCore Query DSL随机选取指定ContentType条目结果重复的问题
你当前的写法无法生成真正的随机结果,原因是对普通字段使用random排序参数并非Elasticsearch(OrchardCore默认搜索引擎)实现随机排序的正确方式,因此每次返回的结果都相同。
正确的Query DSL实现方案
使用function_score结合random_score生成随机排序的结果,示例代码如下:
{ "query": { "function_score": { "query": { "term": { "Content.ContentItem.ContentType": "Product" } }, "functions": [ { "random_score": {} } ], "boost_mode": "replace" } }, "size": 3 }
代码说明
function_score:用于为匹配的文档计算自定义分数,这里用它生成随机分数random_score:Elasticsearch提供的专门用于生成随机排序分数的函数,每次查询都会生成不同的随机值boost_mode: "replace":用随机分数替换文档原本的相关性分数,确保完全按随机顺序排序size: 3:指定返回3条随机条目
另一种等价写法(直接通过排序实现)
如果你更倾向于在sort中定义逻辑,也可以使用以下写法:
{ "query": { "term": { "Content.ContentItem.ContentType": "Product" } }, "sort": [ { "_score": { "order": "desc", "function": { "random_score": {} } } } ], "size": 3 }
内容的提问来源于stack exchange,提问作者amin mohammadi
相关产品推荐
相关产品推荐

