【问题标题】:Elasticsearch DSL FilterElasticsearch DSL 过滤器
【发布时间】:2020-03-12 06:48:14
【问题描述】:

我的弹性搜索过滤器有问题。我正在尝试使用弹性搜索 DSL 过滤器搜索文本,但我遇到了排序问题。

搜索文字:hello world

文档中的其他字符串:Hello there, hello world, hello everyone, hi hello, etc...

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'
                    }
                }]
            }
        }]
    }
}

输出类似于hello大家、hi hello、hello world等。

但我想先hello world

提前致谢!

【问题讨论】:

    标签: python django elasticsearch elasticsearch-dsl


    【解决方案1】:

    根据您的查询,您似乎希望从多个字段中搜索相同的标记。

    当然@jaspreet 提到了你想要的答案,但是如果你想简化你的查询(当然Bool Queries 也很简单),那么你可以使用query_string 如下:

    POST <your_index_name>/_search
    {
      "query": {
        "query_string": {
          "fields": ["title", "original_title"], 
          "query": "hello world",
          "default_operator": "OR"
        }
      }
    }
    

    您还可以使用multi-match 查询来简化您的查询,如下所示:

    POST <your_index_name>/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "multi_match": {
                "query": "hello world",
                "fields": ["title", "original_title"],
                "operator": "OR"
              }
            }
          ]
        }
      }
    }
    

    在这两种用例中,您都会得到想要的结果。

    当然,您需要对其进行测试,看看响应是如何出现的,以及您可以使用这些解决哪些用例。

    注意: 只是基于@Val 评论的附加说明,如果输入来自用户,您也可以使用simple query string 而不是query_string,这与@ 不同987654329@ 不会因语法无效而引发任何错误。

    希望这会有所帮助!

    【讨论】:

    • 另外值得注意的是,如果搜索字符串是由用户输入的,最好使用simple_query_string而不是query_string,因为它不会在搜索语法错误的情况下抛出错误
    【解决方案2】:

    在您的查询中,您使用的是“过滤器”

    filter 参数表示过滤上下文。它的匹配子句用于过滤上下文。它们会过滤掉不匹配的文档,但不会影响匹配文档的分数

    如果您在返回的点击中检查_score,它将为零

    将您的查询替换为

    {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "title": "hello world"
              }
            },
            {
              "match": {
                "original_title": "hello world"
              }
            }
          ]
        }
      }
    }
    

    “hello world” 将获得比 “hello 大家,hi hello,hello world”更高的分数 在弹性搜索中,较短的字段比较长的字段得分更高。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      相关资源
      最近更新 更多