问题 使用Elasticsearch进行简单的AND查询


我试图对两个指定的字段进行简单的查询,手册和谷歌证明没什么帮助。下面的例子应该清楚地说明我想做什么。

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

作为一个额外的问题,为什么它会找到“Daniel Tyrone”和“daniel”,但如果我搜索“Daniel”则不会。它表现得像一个非常奇怪的反案例敏感搜索。


10427
2018-03-18 12:32


起源



答案:


编辑:更新,抱歉。你需要一个单独的 Term Bool查询中每个字段的对象:

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

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

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

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


10
2018-03-18 12:40



您误解了我的区分大小写的问题,我说它的行为类似于INVERSE区分大小写的搜索,当我搜索“Daniel”时它找不到“Daniel” - Alexander Morland
您给出的查询示例,给我一个错误> pastium.org/view/c0efa58b6b7689bfff5a9f480c01ed01 - Alexander Morland
嘎,对不起。我不应该在咖啡之前回答有关SO的问题。我在想和过滤器,实际上ES只有Bool查询。您也可以根据您的使用情况使用Bool或And过滤器。 - Zach
Re:区分大小写......你如何设置分析仪?相同的点适用 - Term仅搜索存储在索引中的确切令牌。你可能有一个分析器在存储之前降低你的文本? - Zach
我还没有真正设置任何分析仪。它只是使用默认值 - Alexander Morland


答案:


编辑:更新,抱歉。你需要一个单独的 Term Bool查询中每个字段的对象:

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

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

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

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


10
2018-03-18 12:40



您误解了我的区分大小写的问题,我说它的行为类似于INVERSE区分大小写的搜索,当我搜索“Daniel”时它找不到“Daniel” - Alexander Morland
您给出的查询示例,给我一个错误> pastium.org/view/c0efa58b6b7689bfff5a9f480c01ed01 - Alexander Morland
嘎,对不起。我不应该在咖啡之前回答有关SO的问题。我在想和过滤器,实际上ES只有Bool查询。您也可以根据您的使用情况使用Bool或And过滤器。 - Zach
Re:区分大小写......你如何设置分析仪?相同的点适用 - Term仅搜索存储在索引中的确切令牌。你可能有一个分析器在存储之前降低你的文本? - Zach
我还没有真正设置任何分析仪。它只是使用默认值 - Alexander Morland


我在同一领域找到了至少多个文本比较的解决方案:

{
  "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"
          }
        }
      ]
    }
  }
}

2
2018-03-18 13:15



是的,您的第二个查询将起作用(假设您希望'daniel tyrone'由doc字段中设置的分析器进行分析)。 - Zach
如果您不确定答案,则不应将其作为答案发布,您可以随时将其添加为对初始问题的评论 - tugcem
最后我发现了这个!第一个查询中的运算符有什么作用?我是对的,它会尝试为given_name找到单词组合吗?换句话说,given_name应该看起来像'daniel tyrone'而不仅仅是daniel或tyrone? - Igor Masternoy


如果用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'
        )
    )); */

0
2017-11-24 22:58