这个问题的目标是解决在前端实现分面导航的问题。我的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”的组过滤掉。
所以我想在文档中的某个地方使用'thomson'的文档,其地理位置为USA或ENGLAND,并且在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
}
}
}
}
}
}
}
}
答案 0 :(得分:1)
只需在must子句
中移动两个should子句{
"query":{
"bool":{
"must": ,
"must":[
{
"multi_match": {
"query": "thomson",
"fields": ["name", "street"]
}
},
{
"terms":{
"geographicLocation.keyword": ["USA", "ENGLAND"]
}
},
{
"terms":{
"Group.keyword": ["AA", "BB"]
}
}
]
}
}
}