19

我正在尝试对两个指定字段进行简单查询,而手册和谷歌证明没有什么帮助。下面的示例应该很清楚我想要做什么。

{
  "query": {
      "and": {
        "term": {
          "name.family_name": "daniel",
          "name.given_name": "tyrone"
        }
      }
   }
}

作为一个额外的问题,为什么它会找到带有“daniel”的“Daniel Tyrone”,但如果我搜索“Daniel”则不会。它的行为就像一个非常奇怪的反大小写敏感搜索。

4

4 回答 4

15

编辑:更新,对不起。Term在 Bool 查询中,每个字段都需要一个单独的对象:

{
  "query": {
    "bool": {
        "must" : [
          {
           "term": {
             "name.family_name": "daniel"
           }
         },
         {
           "term": {
             "name.given_name": "tyrone"
           }
         }
       ]
     }
   }
}

ElasticSearch 不分析术语查询,这使得它们区分大小写。一个 Term 查询对 ES 说“在索引中查找这个确切的标记,包括大小写和标点符号”。

如果您想要不区分大小写,可以在分析器中添加关键字 + 小写过滤器。或者,您可以使用在查询时分析您的文本的查询(如Match查询)

Edit2:您也可以使用 And 或 Bool 过滤器。

于 2013-03-18T12:40:11.263 回答
6

我找到了在同一字段上至少进行多个文本比较的解决方案:

{
  "query": {
    "match": {
      "name.given_name": {
        "query": "daniel tyrone",
        "operator": "and"
      }
    }
  }

我在多个领域发现了这个,这是正确的方法吗?

{
  "query": {
    "bool": {
      "must": [        
        {
          "match": {
            "name.formatted": {
              "query": "daniel tyrone",
              "operator": "and"
            }
          }
        },
        {
          "match": {
            "display_name": "tyrone"
          }
        }
      ]
    }
  }
}
于 2013-03-18T13:15:45.250 回答
0

这对我有用:minimum_should_match设置为,2因为AND查询的参数数量是2.

{
"query": {
    "bool": {
        "should": [
                {"term": { "name.family_name": "daniel"}},
                {"term": { "name.given_name": "tyrone" }}
            ],
    "minimum_should_match" : 2

        }
    }
}
于 2021-04-01T04:09:54.103 回答
0

如果用 PHP 编写 json,这两个示例对我有用。

$activeFilters 只是一个逗号分隔的字符串,例如:'attractions, limpopo'

$articles = Article::searchByQuery(array(
        'match' => array(
            'cf_categories' => array(
                'query' => $activeFilters,
                'operator' =>'and'
            )
        )
    ));

    // The below code is also working 100%
    // Using Query String https://www.elastic.co/guide/en/elasticsearch/reference/1.4/query-dsl-query-filter.html
    // https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html
    /* $articles = Article::searchByQuery(array(
        'query_string' => array(
            'query' => 'cf_categories:attractions AND cf_categories:limpopo'
        )
    )); */
于 2015-11-24T22:58:47.423 回答