我的弹性搜索过滤器有问题。我试图使用弹性搜索DSL过滤器搜索文本,但我面临排序问题。
搜索文本:hello world
文档中的其他字符串:你好那里,你好世界,你好大家好,嗨你好等等。
Elasticsearch-dsl查询是:
MyDocument.search().filter(Q("match", title="hello world") | Q("match", original_title="hello world")).execute()Elasticsearch查询如下:
{
'bool': {
'filter': [{
'bool': {
'should': [{
'match': {
'title': 'hello world'
}
}, {
'match': {
'original_title': 'hello world'
}
}]
}
}]
}
}输出就像你好大家好,嗨你好,你好世界等等。
但我要你好世界第一。
提前感谢!
发布于 2020-03-12 07:27:33
从查询中可以看出,您希望从多个字段中搜索相同的令牌/令牌。
当然@jaspreet提到了您想要的答案,但是如果您想简化查询(当然,Bool查询也很简单),那么您可以使用字符串,如下所示:
POST <your_index_name>/_search
{
"query": {
"query_string": {
"fields": ["title", "original_title"],
"query": "hello world",
"default_operator": "OR"
}
}
}您还可以使用多匹配查询简化查询,如下所示:
POST <your_index_name>/_search
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "hello world",
"fields": ["title", "original_title"],
"operator": "OR"
}
}
]
}
}
}在这两个用例中,您都会得到所需的结果。
当然,您需要测试它,看看响应是如何出现的,以及使用这些方法可以解决哪些用例。
备注:只是基于@Val的注释的附加注释,如果输入来自用户,则还可以使用简单查询字符串而不是query_string,这与query_string不同的是,它不会因为语法无效而引发任何错误。
希望这能有所帮助!
发布于 2020-03-12 07:06:06
在查询中,您使用的是“筛选器”。
filter参数指示筛选器上下文。其匹配子句用于筛选器上下文。它们将筛选出不匹配的文档,但不会影响匹配文档的得分。
如果您将在返回的点击中检查_score,它将为零。
将查询替换为
{
"query": {
"bool": {
"should": [
{
"match": {
"title": "hello world"
}
},
{
"match": {
"original_title": "hello world"
}
}
]
}
}
}在弹性搜索中,"hello world"将比"hello everyone,hi hello,hello world“中的得分更高。
https://stackoverflow.com/questions/60648909
复制相似问题