我试图对两个指定的字段进行简单的查询,手册和谷歌证明没什么帮助。下面的例子应该清楚地说明我想做什么。
{
"query": {
"and": {
"term": {
"name.family_name": "daniel",
"name.given_name": "tyrone"
}
}
}
}
作为一个额外的问题,为什么它会找到“Daniel Tyrone”和“daniel”,但如果我搜索“Daniel”则不会。它表现得像一个非常奇怪的反案例敏感搜索。
编辑:更新,抱歉。你需要一个单独的 Term
Bool查询中每个字段的对象:
{
"query": {
"bool": {
"must" : [
{
"term": {
"name.family_name": "daniel"
}
},
{
"term": {
"name.given_name": "tyrone"
}
}
]
}
}
}
ElasticSearch不会分析术语查询,这使得它们区分大小写。术语查询说ES“在索引中查找这个确切的标记,包括大小写和标点符号”。
如果您想要不区分大小写,可以在分析器中添加关键字+小写过滤器。或者,您可以使用在查询时分析文本的查询(例如 Match
查询)
Edit2:您也可以使用And或Bool过滤器。
编辑:更新,抱歉。你需要一个单独的 Term
Bool查询中每个字段的对象:
{
"query": {
"bool": {
"must" : [
{
"term": {
"name.family_name": "daniel"
}
},
{
"term": {
"name.given_name": "tyrone"
}
}
]
}
}
}
ElasticSearch不会分析术语查询,这使得它们区分大小写。术语查询说ES“在索引中查找这个确切的标记,包括大小写和标点符号”。
如果您想要不区分大小写,可以在分析器中添加关键字+小写过滤器。或者,您可以使用在查询时分析文本的查询(例如 Match
查询)
Edit2:您也可以使用And或Bool过滤器。
我在同一领域找到了至少多个文本比较的解决方案:
{
"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"
}
}
]
}
}
}
如果用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'
)
)); */