2016-11-15 109 views
0

這是elasticsearch 2.3上not_analyzed字符串數組精確匹配,跨多個領域

讓我們假設我有排序的映射:

索引1:

'title': {'type': 'string'}, 
'tags': {'type': 'string', 'index': 'not_analyzed'} 

索引2:

'title': {'type': 'string'}, 
'tags': {'type': 'string', 'index': 'not_analyzed'}, 
'tag_special': {'type': 'string', 'index': 'not_analyzed'} 

注意:當推送到index1和index2時,「tags」是一串字符串。在索引2中,「tag_special」只是一個字符串

我想完成的是一個查詢,我們在兩個索引之間進行查詢,首先查找索引1中標記數組中的確切匹配term或單個字符串在index2中tag_special的值,並將這些匹配提升到堆頂部。那麼我想採取同樣的查詢,然後在兩個指標運行對標題字段正常match查詢

例如文件

{ 
    "_index": "index1", 
    "_type": "index1", 
    "title": "Test Doc 1", 
    "tags": ["tag-1", "tag-2"] 
} 

{ 
    "_index": "index1", 
    "_type": "index1", 
    "title": "Test Doc 2", 
    "tags": ["tag-1"] 
} 

{ 
    "_index": "index1", 
    "_type": "index1", 
    "title": "Test Doc 3", 
    "tags": ["tag-2", "tag-3"] 
} 

{ 
    "_index": "index2", 
    "_type": "index2", 
    "title": "Test Doc inx2 1", 
    "tags": ["tag-1", "tag-2"], 
    "tag_special": "tag-1" 
} 

{ 
    "_index": "index2", 
    "_type": "index2", 
    "title": "Test Doc inx2 2", 
    "tags": ["tag-2"] 
} 

{ 
    "_index": "index2", 
    "_type": "index2", 
    "title": "Test Doc inx2 3", 
    "tags": ["tag-3"], 
    "tag_special": "tag-4" 
} 

絕對沒有我想是相當的工作了。

"query": { 
    "bool": { 
     "should": [ 
      {"term": {"tags": "tag-2"}}, 
     ] 
    } 
} 

回報什麼,奇怪的是,但

"query": { 
    "bool": { 
     "should": [ 
      {"match": {"tags": "tag-2"}}, 
     ] 
    } 
} 

回報太多(它會爲它的使用分析器返回的所有帖子,如果你尋找「標籤2」,然後搜索「標籤」以及「2」)

一旦我可以針對字符串數組項查詢,我需要提高的精確匹配的結果的頂部,然後利用針對標題領域的標準匹配

沒有任何術語查詢確實匹配任何內容應該沒問題,它們需要完全可選。因此,長期的比賽不能充當filtersconstant_score,因爲我需要它有可能使一個正常的標題查詢並具有由得分值排序結果

我至今是

"query": { 
      "bool": { 
       "should": [ 
        {"term": {"tags": "tag-2"}}, 
        {"term": {"tag_special": "tag-2"}}, 
        {"match": {"title": {"query": "tag-2", "operator": "and"}}} 
       ], 
      } 
     } 

但是就這一秒而言,沒有任何東西會被返回。使用multi_match也似乎是,因爲它使用了匹配這條

我覺得什麼,我試圖完成實際上是非常簡單的,像這裏有只一個件事,我在想念這裏,和IM因爲經過數小時試驗和錯誤它快要退出時間了,我希望明天早上我能繼續下去哈哈

感謝您的時間!

回答

0

我做的和你做的一樣,我得到了你的示例文檔的結果。在發佈的查詢中存在一個小問題,因爲在bool查詢中有「,」,儘管只有一個應該。所以查詢應該是這樣的。

"query": { 
     "bool": { 
      "should": [ 
       {"term": {"tags": "tag-2"}}, 
       {"term": {"tag_special": "tag-2"}}, 
       {"match": {"title": {"query": "tag-2", "operator": "and"}}} 
      ] 
     } 
    } 

如果沒有工作,請確保您已設置標籤和tag_special領域not_analyzed

GET index1/_mapping應該顯示這個結果

"index1": { 
    "mappings": { 
    "index1": { 
     "properties": { 
      "tags": { 
       "type": "string", 
       "index": "not_analyzed" 
      }, 
      "title": { 
       "type": "string" 
      } 
     } 
    } 
    } 
} 

如果標籤和tag_special fieds是analyzed術語查詢不會給出任何結果

+0

嗨Hansika,是的,我的'tag'和'tag_special'字段是'not_analyzed'字符串類型。然而,如果我把我的查詢降低到僅僅匹配'tags'這個詞,我什麼也收不回來,就像分析字段一樣 – RedactedProfile

+0

哦,jeez,我想到了...... – RedactedProfile

0

找出我的問題。它與任何事情無關,但我會回答它。

我有兩個問題實際上不會在這裏顯示,但作爲一個警示故事。

  1. 我忘了實際發送映射。因此,每當我「重新創建」索引時,地圖都會根據我所投入的文檔的假設創建自己的自己。
  2. 一旦我實際發送了映射,它仍然不起作用,奇怪的是在發送映射並等待從原始數據庫收集文檔之後,我看不到任何映射信息,直到文檔上傳到ES 。我發現我不小心使用array作爲我在映射中不相關字段之一的類型,而不是string。顯然,與其告訴我存在錯誤,它只是決定完全使地圖無效,直到文檔上傳完畢纔打擾。當我在那個領域改變arraystring時,一切都像魅力一樣。