2017-09-29 13 views
0

此问题的目标是解决有关在我的前端实施分面导航的问题。我在我的用户界面中有一个输入字段,允许用户查询所有字段/所有索引中的任何字词(全文)。我还希望用户能够使用分面导航(例如过滤器)将结果配对。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 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

不知道为什么你不动这两个条款应该的必须的内一? – Val

+0

我查询更新以下,似乎不给我任何命中: { \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

+0

你也分享你的索引的映射?我怀疑你的'geographicLocation'和'Group'字段是经过分析的字符串 – Val

回答

1

只需将两者应该必备条款内的条款

{ 
    "query":{ 
     "bool":{ 
     "must": , 
     "must":[ 
      { 
       "multi_match": { 
        "query": "thomson", 
        "fields": ["name", "street"] 
       } 
      }, 
      { 
       "terms":{ 
        "geographicLocation.keyword": ["USA", "ENGLAND"] 
       } 
      }, 
      { 
       "terms":{ 
        "Group.keyword": ["AA", "BB"] 
       } 
      } 
     ] 
     } 
    } 
} 
+0

Thanks Val。不幸的是,我收到了'parse_exception'错误。给出的原因:“无法用格式[strict_date_optional_time || epoch_millis]解析日期字段[thomson]”。这可能是因为星形搜索搜索字段被格式化为字符串以外的字段?搜索'_all'似乎在进行常规搜索时起作用。 – sags

+0

我已更新查询,您现在得到了什么?另请参阅我对您的问题的第二条评论。 – Val

+0

用我的地图编辑我的原始问题。更新后的查询不会再引发异常,但实际上并未获得任何匹配。 – sags

相关问题