【问题标题】:Elasticsearch - query string or simply query string and howElasticsearch - 查询字符串或只是查询字符串以及如何
【发布时间】:2016-10-26 00:16:07
【问题描述】:

我在 PHP 中有一个城市列表作为数组,比如说 ["Munich", "New York", Chicago"]。

我想在弹性搜索中生成一个查询,基本上说

"SELECT * FROM job_ads WHERE city = Munich OR city = New York OR city = Chicago"

最好的方法是什么?

到目前为止,https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html 似乎最适合这项工作。但如果是的话,我可能需要一些语法方面的帮助,我对 elasticsearch 很陌生。

【问题讨论】:

    标签: php elasticsearch


    【解决方案1】:

    一个简单的方法是像这样使用query string query

    {
      "query": {
        "query_string": {
          "fields": ["city"],
          "query": "Munich OR \"New York\" OR Chicago"
        }
      }
    }
    

    您必须使用 \" 来准确表示 phrase match,否则您将得到包含这两个词中的任何一个的结果。

    现在,如果您可以控制数据,编写此类查询的最佳方法是使用 terms filter,也可以是 cached,但您必须确保 city 字段为not analyzed。您可以阅读更多关于已分析和未分析字段的含义here(向下滚动到为什么术语查询与我的文档不匹配?

    之后你可以像这样使用术语查询

    {
      "query": {
        "terms": {
          "city": [
            "New York",
            "Chicago",
            "Munich"
          ]
        }
      }
    }
    

    【讨论】:

      【解决方案2】:

      根据您提供的文档:您需要阅读标志部分。

      {
          "simple_query_string" : {
              "query" : "Munich | New York | Chicago*",
              "flags" : "OR"
          }
      }
      

      即:有更多的标志

      所以,你可以用json_encode函数在php中创建这个json。

      例子:

      <?php
      
      $source = ['Munich', 'New York', 'Chicago'];
      
      $search = [];
      $search['simple_query_string']['query'] = implode(' | ', $source);
      $search['simple_query_string']['flags'] = 'OR';
      
      echo json_encode($search); // voila !
      
      ?>
      

      提示是使用数组作为源 + implode 函数

      【讨论】:

        猜你喜欢
        • 2015-04-09
        • 2014-12-09
        • 2017-03-28
        • 2012-02-12
        • 1970-01-01
        • 2018-08-03
        • 1970-01-01
        • 2011-05-14
        • 1970-01-01
        相关资源
        最近更新 更多