Elasticsearch 按索引类型和字段搜索
Elasticsearch Search by Index Type and Field
我想在单一索引类型中搜索并通过匹配单一字段进一步过滤它。假设我有书籍、电影和玩具类型。现在,我想搜索惊悚类型的电影,我必须做什么?我的这段代码不起作用并产生了一些错误:
{
"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;
你的语法有误;您不能那样指定两个过滤器。尝试使用 bool must
filter.
我建立了一个简单的索引,然后添加了三个不同类型但相同的文档"genre":
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"
}
}
]
}
}
}
}
}
并取回了正确的文档:
{
"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"
}
}
]
}
}
请注意,我必须在术语过滤器中使用小写 "thriller"。由于我没有指定分析器,而是 standard analyzer will be used, which will transform the text "Thriller" into the term "thriller", so if I'm going to use a term
filter I'll need to use the lower-case version. If I use a match query,我可以使用 "Thriller" 作为查询文本。
这是我用来测试的代码:
http://sense.qbox.io/gist/2f5dc5f15f0ecb50fb9772bbf4d52849031be41d
我想在单一索引类型中搜索并通过匹配单一字段进一步过滤它。假设我有书籍、电影和玩具类型。现在,我想搜索惊悚类型的电影,我必须做什么?我的这段代码不起作用并产生了一些错误:
{
"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;
你的语法有误;您不能那样指定两个过滤器。尝试使用 bool must
filter.
我建立了一个简单的索引,然后添加了三个不同类型但相同的文档"genre":
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"
}
}
]
}
}
}
}
}
并取回了正确的文档:
{
"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"
}
}
]
}
}
请注意,我必须在术语过滤器中使用小写 "thriller"。由于我没有指定分析器,而是 standard analyzer will be used, which will transform the text "Thriller" into the term "thriller", so if I'm going to use a term
filter I'll need to use the lower-case version. If I use a match query,我可以使用 "Thriller" 作为查询文本。
这是我用来测试的代码:
http://sense.qbox.io/gist/2f5dc5f15f0ecb50fb9772bbf4d52849031be41d