使用Elasticsearch进行简单的AND查询

Ale*_*and 15 elasticsearch

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

{
  "query": {
      "and": {
        "term": {
          "name.family_name": "daniel",
          "name.given_name": "tyrone"
        }
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

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

Zac*_*ach 12

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

{
  "query": {
    "bool": {
        "must" : [
          {
           "term": {
             "name.family_name": "daniel"
           }
         },
         {
           "term": {
             "name.given_name": "tyrone"
           }
         }
       ]
     }
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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


Ale*_*and 5

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

{
  "query": {
    "match": {
      "name.given_name": {
        "query": "daniel tyrone",
        "operator": "and"
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

我为多个领域找到了这个,这是正确的方法吗?

{
  "query": {
    "bool": {
      "must": [        
        {
          "match": {
            "name.formatted": {
              "query": "daniel tyrone",
              "operator": "and"
            }
          }
        },
        {
          "match": {
            "display_name": "tyrone"
          }
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)