我有弹性搜索文档,如下所示
{
_index: ecw
_type: grails.gorm.tests.Person
_id: Nb0tHzNDRtq3-rGSO3yVTw
_score: 1
_source: {
firstName: Bart
lastName: Simpson
age: 0
pets: [ ]
}
}
{
_index: ecw
_type: grails.gorm.tests.Person
_id: RxD7mGsvR3i5LT52MAdSLA
_score: 1
_source: {
firstName: Bob
lastName: Builder
age: 0
pets: [ ]
}
}
{
_index: ecw
_type: grails.gorm.tests.Person
_id: rJMEbBqeRcqx3K0HtfGrLg
_score: 1
_source: {
firstName: Bart
lastName: Simpson
age: 9
pets: [ ]
}
}
但是当我在localhost上运行[post]以下过滤器:9200 / ecw / grails.gorm.tests.Person / _search使用head时它什么都不返回。有什么想法吗?
{
"filter": {
"and": {
"filters": [
{
"term": {
"lastName": "Simpson"
}
}
]
}
}
}
答案 0 :(得分:2)
首先,这不是使用and
的正确方法。它需要一个直接过滤器列表,即{"and": [ {"term": ...} ]}
。 (另请参阅http://www.elasticsearch.org/blog/all-about-elasticsearch-filter-bitsets/)
此外,term
过滤器不进行任何文本处理/分析。对文档编制索引时,Simpson
可能已小写为simpson
(等等)。
因此,您需要对{ "term": { "lastName": "Simpson" } }
进行过滤。
最后,如果您想同时使用构面和匹配,则只应在搜索对象上使用filter
,但不希望过滤器影响构面。在所有其他情况下,您希望使用filtered
- 查询。
总而言之,这就是你最终的目标:
{
"query": {
"filtered": {
"filter": {
"term": {
"lastName": "simpson"
}
}
}
}
}
这是一个可运行的示例:https://www.found.no/play/gist/d608591254288783cd0d