2017-09-29 12 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

相關問題