ElasticSearch+Solr幾個案例筆記
(一) 最大能索引字串的長度
關於能索引最大的字串長度,其實在Elasticsearch和Solr中都是由底層的Lucene決定的
(1)不分詞+索引的字串最大長度為32766位元組
(2)分詞+索引一般不會出現長度越界問題
(3)不索引的字串雖然沒有長度最大限制,但是不建議使用搜索引擎儲存大量文字
(二)設定超出一定長度的欄位,不索引
其實這個功能,也是由底層Lucene提供的,關於它的應用場景舉個例子,大部分情況下,不分詞的欄位可能經常會被用來聚合,過濾,排序,分組,但是如果這個不分詞的欄位非常長,通常情況下是沒有意義的,比如標題,小於40個字的,我們索引它,讓它參與聚合,過濾,排序等,但如果大於40,我們則認為它不需要索引,從而節省索引的體積大小,來提高搜尋效能。
如何設定?
(1)在ES中
"message": {
"ignore_above": 20, //超過20個位元組,不索引該欄位,注意對其他欄位沒有影響
"index": "not_analyzed",
"type": "string"
}
(2)在Solr中
<fieldType name="limit_len" class="solr.TextField">
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory" />
//超過10個位元組,就丟棄該欄位,同樣對其他欄位沒有影響
<filter class="solr.LengthFilterFactory" min="0" max="10"/>
</analyzer>
</fieldType>
(三)ElasticSearch中動態mapping的三種校驗模式
在ES中,一個mapping下面可以有多個type,每個type相當於一個表,type的檢驗模式有三種
//預設模式,開啟動態模式,允許任何欄位新增到該表中
(1)"dynamic": true
//關閉動態模式,不在定義的scheam中的欄位,會自動忽略,不會報錯
(2)"dynamic": false
//嚴格模式,不在定義的scheam中的欄位,會拒絕索引,丟擲異常
(3)"dynamic": "strict"
注意type的schema是有校驗模式的,但是每個mapping裡面的type卻是動態的,新增一個不存在的type並不會報錯,es會自動識別它的schema裡面的欄位並給予其認為可能的欄位型別
(四)ElasticSearch中queryString語法的一個小坑
ElasticSearch裡面索引一個不分詞的欄位時候,如果不給設定自動轉小寫的filter,那麼他就是資料本身,但是查詢的時候,預設情況下es會給轉成小寫查。
舉個例子: 索引name=Hadoop進入es索引,然後使用name=Hadoop查,你會發現使用querySting語法查不到,因為es自動把Hadoop轉成了hadoop去查,這樣以來肯定查不到,有點小坑,這個問題在Solr中是不存在的。
如何解決:
//更改es預設轉小寫的bool值為false
QueryBuilders.queryStringQuery("name:Hadoop").lowercaseExpandedTerms(false)
(五)ElasticSearch+Solr使用queryString語法的注意事項
lucene的預設的queryString語法,如果一個關鍵詞裡面帶有空格,它會自動拆分成兩個關鍵詞進行檢索,但有時我們就是查詢帶空格的關鍵詞,應該怎麼辦呢?
舉個例子:
不分詞+索引欄位content=Syntax error 進入es,solr或者lucene中
假如我想使用字首模糊查詢:
content:Syntax err*
上面的語法是查不到任何內容的,但是明明有這條資料,為什麼查不到?就是因為lucene預設會把空格當做多個關鍵詞分界線,這樣以來查詢就轉化成了:
content:Syntax
default_field:err*
所以就查不到資料了,如何解決?
非常簡單,轉義這個空格即可,注意只能轉義空格,不能對整個查詢字串進行轉義:
content:Syntax\\ err*
有什麼問題可以掃碼關注微信公眾號:我是攻城師(woshigcs),在後臺留言諮詢。
技術債不能欠,健康債更不能欠, 求道之路,與君同行。