我过去几个月一直在使用ElasticSearch,但在我必须传递复杂查询时仍然觉得很复杂。
我想运行必须搜索多个“类型”的查询,并且必须使用自己的“过滤器”搜索每个类型,但需要合并“搜索结果”
例如:
我需要搜索我的朋友的“用户类型”文档,同时我必须根据提供的关键字搜索我喜欢的“对象类型”文档。
OR
具有“AND”和“NOT”子句的查询
示例查询:
$options['query'] = array(
'query' => array(
'filtered' => array(
'query' => array(
'query_string' => array(
'default_field' => 'name',
'query' => $this->search_term . '*',
),
),
'filter' => array(
'and' => array(
array(
'term' => array(
'access_id' => 2,
),
),
),
'not' => array(
array(
'term' => array(
'follower' => 32,
),
),
array(
'term' => array(
'fan' => 36,
),
),
),
),
),
),
);
因为此查询旨在搜索具有access_id = 2的用户,但不得拥有id 32的粉丝和id 36的粉丝
但这不起作用..
编辑:修改后的查询
{
"query": {
"filtered": {
"filter": {
"and": [
{
"not": {
"filter": {
"and": [
{
"query": {
"query_string": {
"default_field": "fan",
"query": "*510*"
}
}
},
{
"query": {
"query_string": {
"default_field": "follower",
"query": "*510*"
}
}
}
]
}
}
},
{
"term": {
"access_id": 2
}
}
]
},
"query": {
"field": {
"name": "xyz*"
}
}
}
}
}
现在运行此查询后,我得到两个结果,一个跟随者:“34,518”&粉丝:“510”,第二个粉丝:“34”,但它不应该只是结果中的第二个。
有什么想法吗?
答案 0 :(得分:14)
您可能希望查看我本月发布的演示文稿的幻灯片,其中介绍了查询DSL如何工作的基础知识:
Terms of endearment - the ElasticSearch Query DSL explained
您的查询存在的问题是您的过滤器嵌套不正确。 and
和not
过滤器属于同一级别,但not
过滤器应位于and
下:
curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1' -d '
{
"query" : {
"filtered" : {
"filter" : {
"and" : [
{
"not" : {
"filter" : {
"and" : [
{
"term" : {
"fan" : 36
}
},
{
"term" : {
"follower" : 32
}
}
]
}
}
},
{
"term" : {
"access_id" : 2
}
}
]
},
"query" : {
"field" : {
"name" : "keywords to search"
}
}
}
}
}
'
答案 1 :(得分:3)
我刚试过“BOOL”
{
"query": {
"bool": {
"must": [
{
"term": {
"access_id": 2
}
},
{
"wildcard": {
"name": "xyz*"
}
}
],
"must_not": [
{
"wildcard": {
"follower": "*510*"
}
},
{
"wildcard": {
"fan": "*510*"
}
}
]
}
}
}
它给出了正确答案。
但我不确定它是否应该像这样使用?