1. 程式人生 > >ElasticSearch+Solr幾個案例筆記

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