2017-01-16 31 views
0

我們在elastic文件保存在以下結構:elasticsearch:合併文本匹配和數組包含

{ 
    ... 
    name: "name", 
    ancestors: ["id1", "id2", "id3"], 
    ... 
} 

我想創建一個搜索name: "some name"ANDancestors contains "id1"搜索查詢。

我試過很多查詢,但似乎沒有工作,或返回所需的結果。如果有任何幫助,這個組合查詢應該每次只返回一個條目。

一些我已經試過查詢有以下幾種:

filtered: { 
    query: { 
     query_string: { 
      query: "name:name" 
     }, 
     term: { 
      ancestors: "id1" 
     } 
    } 
} 

__

match: { 
    name: "name", 
    ancestors: "id1" 
}, 
defaultOperator: 'AND' 

__

bool: { 
    must: { term: { name: "name" }}, 
    filter: { 
     term: { ancestors: "id1" } 
    } 
} 

的映射如下:

{ 
    "data": { 
    "mappings": { 
     "entry": { 
     "properties": { 
      "ancestors": { 
      "type": "string" 
      }, 
      "id": { 
      "type": "string" 
      }, 
      "name": { 
      "type": "string" 
      } 
     } 
     } 
    } 
    } 
} 

我們沒有改變默認的映射,這就是爲什麼ancestorsstring型的,但我不認爲這有什麼差別

+0

你嘗試過什麼疑問? – Richa

+0

我在問題 – XeniaSis

+0

中增加了一些,還分享了映射..'GET/index/type/_mapping' – Richa

回答

1

嘗試此查詢:

{ 
"query": { 
    "bool": { 
    "must": [ 
     { 
     "query_string": { 
      "default_field": "name", 
      "query": "stripe AND 1" 
     } 
     }, 
     { 
      "match": { 
       "ancestors": "id1" 
      } 
      } 
     ] 
    } 
    } 
} 
+0

返回多個文檔。似乎沒有應用'AND'運算符 – XeniaSis

+0

'must'將總是在多個查詢之間應用AND。也許你有多個文件來滿足這個條件。 – Richa

+0

祖先可能包含相同的id,但祖先不能包含許多同名的孩子。這就是爲什麼總是必須有一個條目 – XeniaSis