此问题的目标是解决有关在我的前端实施分面导航的问题。我在我的用户界面中有一个输入字段,允许用户查询所有字段/所有索引中的任何字词(全文)。我还希望用户能够使用分面导航(例如过滤器)将结果配对。ElasticSearch - 跨所有字段搜索关键字,并使用过滤器对结果进行配对
例如,如果用户搜索关键字“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' }
首先,我应该只得到的结果有“汤姆逊”在附近的田野里(例如,高于前两个文档) 。然后,应按照“USA”或“ENGLAND”以及“AA”或“BB”组的地理位置过滤这些地理位置。
因此,我希望文档中带有“thomson”的文档中的某个地理位置位于美国或英格兰的任何地方,并且要么位于AA组中,要么位于BB组中。这使我只有第一份文件。
我有一个不可能的时间管理上述ES params来获得它的工作。
编辑:这是我的映射:
{
"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
}
}
}
}
}
}
}
}
不知道为什么你不动这两个条款应该的必须的内一? – Val
我查询更新以下,似乎不给我任何命中: { \t “查询”:{ \t \t “布尔”:{ \t \t \t “必须”: \t \t \t \t { “multi_match”:{ “查询”: “汤姆森”, “字段”:[ “*”]}}, \t \t \t \t { “术语”:{ “geographicLocation”:[ “美国”,“ENGLAND “]}}, \t \t \t \t { “条款”:{ “组”: “AA”, “BB”]}} \t \t \t] \t \t} \t}} 能 – sags
你也分享你的索引的映射?我怀疑你的'geographicLocation'和'Group'字段是经过分析的字符串 – Val