这个问题的目的是解决有关在前端实现多面导航的问题。我的UI中有一个输入字段,允许用户查询所有字段/所有索引中的任何术语(全文)。我还希望用户能够使用多面导航(例如过滤器)将结果配对。
例如,如果用户搜索关键字“汤姆森”,则应在所有字段中进行搜索。然后,将向用户显示两个(或更多)表示过滤器的复选框(例如,“地理位置”和“组”)-这应该是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' }
首先,我应该只在字段中某处出现“汤姆森”的结果(例如,上面的前两个文档)。然后,应使用“USA”或“ENGLAND”的地理位置以及“AA”或“BB”的组来过滤掉这些位置。
因此,我希望文档中某处带有“汤姆森”字样的文档具有美国或英国的地理位置,并且位于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
}
}
}
}
}
}
}
}
最佳答案
只需将两个must子句移到must子句中
{
"query":{
"bool":{
"must": ,
"must":[
{
"multi_match": {
"query": "thomson",
"fields": ["name", "street"]
}
},
{
"terms":{
"geographicLocation.keyword": ["USA", "ENGLAND"]
}
},
{
"terms":{
"Group.keyword": ["AA", "BB"]
}
}
]
}
}
}
关于elasticsearch - ElasticSearch-在所有字段中搜索关键字,并使用过滤器将结果配对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46490634/