Elasticsearch - 查询字符串或只是查询字符串以及如何

时间:2016-10-26 00:16:07

标签: php elasticsearch

我在PHP中有一个城市列表,让我们说["慕尼黑","纽约",芝加哥和#34;]。

我想在弹性搜索中生成一个基本上是

的查询
"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似乎是这项工作的最佳选择。但如果是这样,我可能需要一些语法帮助,我对弹性搜索很新。

2 个答案:

答案 0 :(得分:0)

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

{
    "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函数的数组的使用

答案 1 :(得分:0)

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

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

您必须使用 \&#34; 作为完整的phrase match,否则您将获得包含这两个单词中的任何一个的结果。

现在,如果您掌握了数据,那么编写此类查询的最佳方法是使用terms filter也可以cached,但您必须确保 city 字段为not analyzed。您可以详细了解已分析字段和未分析字段的含义here(向下滚动至为什么查询字词不匹配我的文档?

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

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