2015-04-17 41 views
0

我想在单个索引类型中进行搜索,并通过匹配单个字段进一步对其进行过滤。假设我有书籍,电影和玩具类型。现在,我想搜索一部电影中的惊悚片,我该怎么办?我有此代码不能正常工作,并产生一些错误:Elasticsearch按索引类型和字段搜索

{ 
      "from" : 0, 
      "size" : 10, 
      "query": { 
       "filtered" : { 
        "filter" : { 
         "type" : { 
          "value" : "movies" 
         }, 
         "term" : { 
          "genre" : "Thriller" 
         } 
        } 
       } 
      }, 
      "sort": [ 
       { 
        "date_entered" : { 
         "order": "desc" 
        } 
       } 
      ] 
     } 

的错误是这样的:

{"error":"SearchPhaseExecutionException[Failed to execute phase [query], all shards failed; 

回答

1

你的语法是错误的;你不能以这种方式指定两个过滤器。尝试使用bool must filter

我成立了一个简单的索引,然后添加不同类型的三个文档,但有相同的“流派”:

PUT /test_index 

POST /test_index/_bulk 
{"index":{"_type":"books"}} 
{"genre":"Thriller"} 
{"index":{"_type":"movies"}} 
{"genre":"Thriller"} 
{"index":{"_type":"toys"}} 
{"genre":"Thriller"} 

然后运行这个查询:

POST /test_index/_search 
{ 
    "from": 0, 
    "size": 10, 
    "query": { 
     "filtered": { 
     "query": { 
      "match_all": {} 
     }, 
     "filter": { 
      "bool": { 
       "must": [ 
        { 
        "type": { 
         "value": "movies" 
        } 
        }, 
        { 
        "term": { 
         "genre": "thriller" 
        } 
        } 
       ] 
      } 
     } 
     } 
    } 
} 

和回来的right doc:

{ 
    "took": 10, 
    "timed_out": false, 
    "_shards": { 
     "total": 1, 
     "successful": 1, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 1, 
     "max_score": 1, 
     "hits": [ 
     { 
      "_index": "test_index", 
      "_type": "movies", 
      "_id": "uReb0g9KSLKS18sTATdr3A", 
      "_score": 1, 
      "_source": { 
       "genre": "Thriller" 
      } 
     } 
     ] 
    } 
} 

请注意,我必须在术语过滤器中使用小写的“惊悚片”。由于我没有指定分析器,因此将使用standard analyzer,这会将文本“Thriller”转换为术语“惊悚片”,因此如果我要使用term过滤器,则需要使用低分辨率案例版本。如果我使用match query,我可以使用“Thriller”作为查询文本。

这里是我用于测试的代码:

http://sense.qbox.io/gist/2f5dc5f15f0ecb50fb9772bbf4d52849031be41d