我很难用Elasticsearch构建查询。
我想查询类似的东西:
WHERE field_1 is 'match' $string OR field_2 is 'wildcard_match' $string OR field_3 is 'fuzzy' $string
所以我试图构造的是这样的:
{ "bool" : { "should" : [ { "match" : { "field_1" : "testing" } }, { "wildcard" : { "field_2" : "*testing*" } }, { "fuzzy" : { "field_3" : "testing" } } ], "minimum_should_match" : 1, } }
但这似乎返回一个错误。
谁能给我一个指针,我应该如何看待用Elasticsearch进行这种OR查询?
我当前的数据已发送:
{ "_index": "twitter", "_type": "tweet", "_id": "1", "_version": 1, "found": true, "_source": { "field_1": "some data", "field_2": "testing data", "field_3": "other things" } }
和我的查询:
curl -XGET 'http://localhost:9200/twitter/tweet/_search' -d ' "query" : { "bool" : { "should" : [ { "match" : { "field_1" : "testing" } }, { "wildcard" : { "field_2" : "*testing*" } }, { "fuzzy" : { "field_3" : "testing" } } ], "minimum_should_match" : 1, } }'
返回此错误:
SearchPhaseExecutionException[Failed to execute phase [query], all shards failed; shardFailures {[ZmwpcILwSEyufHf-t9xQ6g][twitter][0]: SearchParseException[[twitter][0]: from[-1],size[-1]: Parse Failure [Failed to parse source [ { "query": { "bool": { "should": [ { "match": { "field_1": "testing" } }, { "wildcard": { "field_2": "*testing*" } }, { "fuzzy": { "field_3": "testing" } } ], "minimum_should_match": 1, } } } ]]]; nested: ElasticsearchParseException[Expected START_OBJECT but got VALUE_STRING null]; }{[ZmwpcILwSEyufHf-t9xQ6g][twitter][1]: SearchParseException[[twitter][1]: from[-1],size[-1]: Parse Failure [Failed to parse source [ { "query": { "bool": { "should": [ { "match": { "field_1": "testing" } }, { "wildcard": { "field_2": "*testing*" } }, { "fuzzy": { "field_3": "testing" } } ], "minimum_should_match": 1, } } } ]]]; nested: ElasticsearchParseException[Expected START_OBJECT but got VALUE_STRING null]; }{[ZmwpcILwSEyufHf-t9xQ6g][twitter][2]: SearchParseException[[twitter][2]: from[-1],size[-1]: Parse Failure [Failed to parse source [ { "query": { "bool": { "should": [ { "match": { "field_1": "testing" } }, { "wildcard": { "field_2": "*testing*" } }, { "fuzzy": { "field_3": "testing" } } ], "minimum_should_match": 1, } } } ]]]; nested: ElasticsearchParseException[Expected START_OBJECT but got VALUE_STRING null]; }{[ZmwpcILwSEyufHf-t9xQ6g][twitter][3]: SearchParseException[[twitter][3]: from[-1],size[-1]: Parse Failure [Failed to parse source [ { "query": { "bool": { "should": [ { "match": { "field_1": "testing" } }, { "wildcard": { "field_2": "*testing*" } }, { "fuzzy": { "field_3": "testing" } } ], "minimum_should_match": 1, } } } ]]]; nested: ElasticsearchParseException[Expected START_OBJECT but got VALUE_STRING null]; }{[ZmwpcILwSEyufHf-t9xQ6g][twitter][4]: SearchParseException[[twitter][4]: from[-1],size[-1]: Parse Failure [Failed to parse source [ { "query": { "bool": { "should": [ { "match": { "field_1": "testing" } }, { "wildcard": { "field_2": "*testing*" } }, { "fuzzy": { "field_3": "testing" } } ], "minimum_should_match": 1, } } } ]]]; nested: ElasticsearchParseException[Expected START_OBJECT but got VALUE_STRING null]; }]
这是由于JSON格式错误所致。此查询的正确JSON格式如下-
{ // --->> This was missing "query": { "bool": { "should": [ { "match": { "field_1": "testing" } }, { "wildcard": { "field_2": "*testing*" } }, { "fuzzy": { "field_3": "testing" } } ], "minimum_should_match": 1 } } } // --->> This was missing