2012-04-10 15 views
10

我使用方面術語來獲取所有唯一值和它們的字段數。我得到錯誤的結果。如何防止方面術語被標記化

term: web 
Count: 1191979 
term: misc 
Count: 1191979 
term: passwd 
Count: 1191979 
term: etc 
Count: 1191979 

雖然實際結果應該是:

term: WEB-MISC /etc/passwd 
Count: 1191979 

這裏是我的示例查詢:

{ 
    "facets": { 
    "terms1": { 
     "terms": { 
     "field": "message" 
     } 
    } 
    } 
} 
+0

你能更新與數據的_short_例子,你在做查詢的_short_例子的問題,所以它的更多的信息,爲用戶來到這裏從谷歌搜索等? – karmi 2012-04-11 09:14:52

回答

16

如果重建索引是一個選項,這將是最好的改變映射和標記此字段爲未分析

"your_field" : { "type": "string", "index" : "not_analyzed" } 

您可以使用multi field type如果保持電場的分析版本需要:

"your_field" : { 
    "type" : "multi_field", 
    "fields" : { 
     "your_field" : {"type" : "string", "index" : "analyzed"}, 
     "untouched" : {"type" : "string", "index" : "not_analyzed"} 
    } 
} 

這樣,您就可以繼續在查詢中使用your_field,同時採用your_field.untouched運行方面的搜索。

另外,如果該字段存儲,您可以使用腳本場面代替:

"facets" : { 
    "term" : { 
    "terms" : { 
     "script_field" : "_fields.your_field.value" 
    } 
    } 
} 

作爲最後的手段,如果該字段不是存儲,而是記錄源是存儲在索引中,你可以試試這個:

"facets" : { 
    "term" : { 
    "terms" : { 
     "script_field" : "_source.your_field" 
    } 
    } 
} 

第一個解決方案是最高效的。最後一個解決方案效率最低,並且可能需要很長時間處理大型索引。

+0

我試過了script_field,但它似乎產生了一個錯誤。我當前的查詢看起來像這樣:http://www.pastebin.com/XwJMM7Eq – jmnwong 2012-04-10 19:48:11

+0

它可能會給你「標識符:logsource的未解析的屬性」錯誤。這是因爲elasticsearch腳本不知道'logsource'的含義。嘗試用_fields.logsource代替它 – imotov 2012-04-10 19:57:27

+0

顯示爲「term」「[email protected]」 – jmnwong 2012-04-10 20:13:15

-1

我已經簡要解釋了這個問題,並提出了兩種解決方案here。 我在這裏談到了多種方法。 一種是使用not_analyzed來保持字符串的原樣。但是,因爲它有不區分大小寫的缺點,所以更好的方法是使用關鍵字標記+小寫過濾器

+0

儘管這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – Leigh 2015-10-10 03:10:02

+0

我已經介紹了我的答案。 – 2015-11-01 16:42:37

0

哇,我今天也得到了同樣的問題,同時在最近的彈性搜索中聚合了術語。谷歌搜索和部分理解後,發現這個令人討厭的索引是如何工作的(這非常簡單)。

查詢只能找到實際存在的倒排索引

當指數下列字符串

"WEB-MISC /etc/passwd" 

它將被傳遞到分析儀方面。分析儀可能將其標記爲

"WEB", "MISC", "etc" and "passwd" 

及其位置詳細信息。並且此令牌可能會過濾爲小寫字母,例如

"web", "misc", "etc" and "passwd" 

因此,索引後,搜索查詢只能看到上述4。不是完整的單詞「WEB-MISC/etc/passwd」。爲了您的需求,以下是我的選擇,你可以使用

1.Change the Default Analyzer used by elasticsearch([link][1]) 
2.If it is not need, just TurnOff the analyzer by setting 'not_analyzed' for the fields you need 
3.To convert the already indexed data searchable, re-indexing is the only option