ElasticSearch+Solr幾個案例筆記

(一) 最大能索引字符串的長度

關於能索引最大的字符串長度,其實在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>

(三)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裏面的字段並給予其認爲可能的字段類型token

(四)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),在後臺留言諮詢。 技術債不能欠,健康債更不能欠, 求道之路,與君同行。

輸入圖片說明

相關文章
相關標籤/搜索