这个问题的目的是解决在我的前端实施刻面导航方面的问题。我在UI中有一个输入字段,允许用户查询所有字段/所有索引上的任何术语(全文)。我还希望用户能够使用刻面导航(例如过滤器)将结果与结果配对。
例如,如果用户搜索关键字" Thomson",则应在所有字段中搜索。然后,将向用户提供代表过滤器的两个(或更多)复选框(例如,"地理位置"one_answers"组") - 这应该是一个和过滤器。我已经尝试了以下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' }
首先,我只能获得在字段中某个地方具有"汤姆森"的结果(例如,上面的前两个文档)。然后,应通过"美国"或"英格兰"one_answers" 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
}
}
}
}
}
}
}
}
简单地将两个移动在必需条款中
{
"query":{
"bool":{
"must": ,
"must":[
{
"multi_match": {
"query": "thomson",
"fields": ["name", "street"]
}
},
{
"terms":{
"geographicLocation.keyword": ["USA", "ENGLAND"]
}
},
{
"terms":{
"Group.keyword": ["AA", "BB"]
}
}
]
}
}
}