關於能索引最大的字符串長度,其實在Elasticsearch和Solr中都是由底層的Lucene決定的微信
(1)不分詞+索引的字符串最大長度爲32766字節app
(2)分詞+索引通常不會出現長度越界問題oop
(3)不索引的字符串雖然沒有長度最大限制,可是不建議使用搜索引擎存儲大量文本性能
其實這個功能,也是由底層Lucene提供的,關於它的應用場景舉個例子,大部分狀況下,不分詞的字段可能常常會被用來聚合,過濾,排序,分組,可是若是這個不分詞的字段很是長,一般狀況下是沒有意義的,好比標題,小於40個字的,咱們索引它,讓它參與聚合,過濾,排序等,但若是大於40,咱們則認爲它不須要索引,從而節省索引的體積大小,來提升搜索性能。ui
如何設置?搜索引擎
(1)在ES中code
"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>
在ES中,一個mapping下面能夠有多個type,每一個type至關於一個表,type的檢驗模式有三種索引
//默認模式,開啓動態模式,容許任何字段添加到該表中 (1)"dynamic": true //關閉動態模式,不在定義的scheam中的字段,會自動忽略,不會報錯 (2)"dynamic": false //嚴格模式,不在定義的scheam中的字段,會拒絕索引,拋出異常 (3)"dynamic": "strict"
注意type的schema是有校驗模式的,可是每一個mapping裏面的type倒是動態的,添加一個不存在的type並不會報錯,es會自動識別它的schema裏面的字段並給予其認爲可能的字段類型token
ElasticSearch裏面索引一個不分詞的字段時候,若是不給設置自動轉小寫的filter,那麼他就是數據自己,可是查詢的時候,默認狀況下es會給轉成小寫查。
舉個例子: 索引name=Hadoop進入es索引,而後使用name=Hadoop查,你會發現使用querySting語法查不到,由於es自動把Hadoop轉成了hadoop去查,這樣以來確定查不到,有點小坑,這個問題在Solr中是不存在的。
如何解決:
//更改es默認轉小寫的bool值爲false QueryBuilders.queryStringQuery("name:Hadoop").lowercaseExpandedTerms(false)
lucene的默認的queryString語法,若是一個關鍵詞裏面帶有空格,它會自動拆分紅兩個關鍵詞進行檢索,但有時咱們就是查詢帶空格的關鍵詞,應該怎麼辦呢?
舉個例子:
不分詞+索引字段content=Syntax error 進入es,solr或者lucene中
假如我想使用前綴模糊查詢:
content:Syntax err*
上面的語法是查不到任何內容的,可是明明有這條數據,爲何查不到?就是由於lucene默認會把空格當作多個關鍵詞分界線,這樣以來查詢就轉化成了:
content:Syntax default_field:err*
因此就查不到數據了,如何解決?
很是簡單,轉義這個空格便可,注意只能轉義空格,不能對整個查詢字符串進行轉義:
content:Syntax\\ err*
有什麼問題能夠掃碼關注微信公衆號:我是攻城師(woshigcs),在後臺留言諮詢。 技術債不能欠,健康債更不能欠, 求道之路,與君同行。