另一種在查詢時不匹配所有不良詞的方法是在索引時使用synonym
token filter來匹配這些詞並標記包含不良詞的文檔。
所有你需要做的是存儲在文件系統中的文件你的壞字(Elasticsearch主目錄):
analysis/badwords.txt
:
word1 => BADWORD <--- pick whatever you want the badword to be replaced with
word2 => BADWORD
...
word1000 => BADWORD
那麼你的索引設置需要使用synonym
令牌過濾
curl -XPUT localhost:9200/my_index -d '{
"settings" : {
"analysis" : {
"analyzer" : {
"badwords" : {
"tokenizer" : "whitespace",
"filter" : ["synonym"]
}
},
"filter" : {
"synonym" : {
"type" : "synonym",
"synonyms_path" : "analysis/badwords.txt"
}
}
}
},
"mappings": {
"my_type": {
"properties": {
"content": {
"type": "string",
"index_analyzer": "badwords"
}
}
}
}
}'
然後,當你的索引文檔用content
場包含一些BA d字符與您的badwords.txt
文件中的字符相匹配,它會被您在同義詞文件中選擇的替換字正確替換。
curl -XPOST 'localhost:9200/my_index/_analyze?analyzer=badwords&pretty' -d 'you are a word2'
{
"tokens" : [ {
"token" : "you",
"start_offset" : 0,
"end_offset" : 3,
"type" : "word",
"position" : 1
}, {
"token" : "are",
"start_offset" : 4,
"end_offset" : 7,
"type" : "word",
"position" : 2
}, {
"token" : "a",
"start_offset" : 8,
"end_offset" : 9,
"type" : "word",
"position" : 3
}, {
"token" : "BADWORD",
"start_offset" : 10,
"end_offset" : 14,
"type" : "SYNONYM",
"position" : 4
} ]
}
來源
2015-09-27 05:24:03
Val
我想你必須爲此寫一個自定義匹配器。無論如何,1000個元素的香草布爾查詢不會有效。 – Ashalynd
最初的請求會很慢,但是如果您可以使用過濾器而不是查詢禁止的單詞列表,那麼該過濾器將被緩存(使後續執行非常便宜!) –