【发布时间】:2017-09-29 22:39:19
【问题描述】:
这个问题的目的是解决在我的前端实现分面导航的问题。我的 UI 中有一个输入字段,允许用户在所有字段/所有索引中查询任何术语(全文)。我还希望用户能够使用分面导航(例如过滤器)将结果配对。
例如,如果用户搜索关键字“thomson”,则应该搜索所有字段。然后,用户将看到两个(或更多)表示过滤器的复选框(比如说一个“地理位置”和一个“组”)——这应该是一个 AND 过滤器。我尝试了以下 ElasticSearch 查询无济于事。
{
"query":{
"bool":{
"must": {
"multi_match": {
"query": "thomson",
"fields": ["*"]
}
},
"should":[
{
"terms":{
"geographicLocation": ["USA", "ENGLAND"]
}
},
{
"terms":{
"Group": ["AA", "BB"]
}
}
]
}
}
}
假设我在 ES 中有以下文档:
{ name: 'Joe', street: '3 thomson st', geographicLocation: 'USA', Group: 'AA' }
{ name: 'Thomson': street: '1 york ave', geographicLocation: 'CHINA', Group: 'BB' }
{ name: 'Jane', street: '2 jones dr' geographicLocation: 'ENGLAND', Group: 'CC' }
首先,我应该只得到字段中某处包含“thomson”的结果(例如,上面的前两个文档)。然后,应按“USA”或“ENGLAND”和“AA”或“BB”组的 geoLocations 过滤掉这些。
所以我想要文档中某处带有“thomson”的文档,其地理位置为美国或英国,并且属于 AA 组或 BB 组。这让我只剩下第一个文件。
我很难管理上述 ES 参数以使其正常工作。
编辑:这是我的映射:
{
"person": {
"mappings": {
"TEST": {
"properties": {
"name": {
"type": "text"
},
"street": {
"type": "text"
},
"EndDate": {
"type": "long"
},
"EndDt": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"Group": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"d3232b0e1b28bfb8b432a3459404676d:created_date": {
"type": "date"
},
"d3232b0e1b28bfb8b432a3459404676d:edited": {
"type": "date"
},
"geographicRegion": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
}
【问题讨论】:
-
不确定为什么不将两个 should 子句都移到 must 子句中?
-
我将查询更新为以下内容,但它似乎没有给我任何点击:{“query”:{“bool”:{“must”:[{“multi_match”:{“查询”:“汤姆森”,“字段”:[“*”]}},{“术语”:{“地理位置”:[“美国”,“英格兰”]}},{“术语”:{“组” : ["AA", "BB"] } } ] } } }
-
能否也分享一下你索引的映射?我怀疑你的
geographicLocation和Group字段是分析字符串
标签: elasticsearch