當前位置:編程學習大全網 - 熱門推薦 - ElastiSearch默認分詞器

ElastiSearch默認分詞器

在Elasticsearch中的數據可以分為兩類: 精確值(exact values)以及全文(full text) 。

精確值 :例如日期類型date,若date其有兩個值:2014-09-15與2014,那麽這兩個值不相等。又例如字符串類型foo與Foo不相等。

全文 :通常是人類語言寫的文本,例如壹段tweet信息、email的內容等。

精確值很容易被索引 :壹個值要麽相當要麽不等。 索引全文值就需要很多功夫。例如我們不僅要想:這個文檔符合我們的查詢嗎?還要想:這個文檔有多符合我們的查詢?換句話說就是:這個文檔跟我們的查詢關聯大嗎?我們很少精確的去匹配整個全文,我們最想要的是去匹配全文文本的內部信息。除此,我們還希望搜索能夠理解我們的意圖:例如

如果妳搜索UK,我們需要包含United Kingdom的文本也會被匹配。 如果妳搜索jump,那麽包含jumped,jumps,jumping,更甚者leap的文本會被匹配。

為了更方便的進行全文索引,Elasticsearch首先要先分析文本,然後使用分析過的文本去創建倒序索引。

Elasticsearch全文檢索默認分詞器為standard analyzer。standard analyzer中,character Filter什麽也沒有做,Token Filters只是把英文大寫轉化為小寫,因此Elasticsearch默認對大小寫不敏感,下面主要介紹Tokenizer。

token分隔符把text分隔為token(term)。數據寫入的時候會使用standard analyzer處理,text會被處理為token列表。搜索的text也會執行相同的處理,最後使用處理後的token和源text處理後的token匹配。

除了“a-z、A-Z、0-9、_”以外,但不包括“.;,”這三個字符,其他情況都是token分隔符。

“.”鏈接number和char時,作為token分隔符,其它情況不是分隔符

1)“number.number”經過standard analyzer處理後,token列表[number.number]

例如“123.123s”,搜索“123”是搜索不到的,搜索“123.123s”是可以匹配的

2)“char.char”經過standard analyzer處理後,token列表[char.char]

例如“test.test”,搜索“test”是搜索不到的,搜索“test.test”是可以匹配的

3)“number.char或者char.number”經過standard analyzer處理後,token列表[number、char]

例如“test1.s1”,token列表為[test1、s1],搜索“test1”是可以匹配的

“;”鏈接number和number時,不作為token分隔符,其它情況都是分隔符

1)“number;number”經過standard analyzer處理後,token列表[number;number]

例如“123;123”,搜索“123”是搜索不到的,搜索“123;123”是可以匹配的

2)“number;char或者char;number”經過standard analyzer處理後,token列表[number、char]

例如“test1;s1”,搜索“test1”是可以匹配的

3)“char;char”經過standard analyzer處理後,token列表[char、char]

例如“test1;ss1”,搜索“test1s”可以匹配的

“,”鏈接number和number時,不作為token分隔符,其它情況都是分隔符

1)“number,number”經過standard analyzer處理後,token列表[number,number]

例如“123,123”,搜索“123”是搜索不到的,搜索“123,123”是可以匹配的

2)“number,char或者char,number”經過standard analyzer處理後,token列表[number、char]

例如“test1,s1”,搜索“test1”是可以匹配的

3)“char,char”經過standard analyzer處理後,token列表[char、char]

例如“test;s1”,搜索“test”是可以匹配的

在最前面和最後面都是token分隔符

1)“[,.;]char [,.;]”經過standard analyzer處理後,token列表[char]

例如“,.test…”,搜索“test”可以匹配

2)“[,.;]number [,.;]”經過standard analyzer處理後,token列表[number]

例如“,.123…”,搜索“123”可以匹配

3)“_[token分隔符]number或者”經過standard analyzer處理後,token列表[number]

存儲字符串:“123 test1:a_b a.b”,分詞後的token為:[123、test1、a_b、a.b]

1)使用關鍵字term搜索 123、test1、a_b或a.b可以匹配

2)使用關鍵字term搜索“test1##a_b”也可以匹配,在這兒“#”只是起了個分隔符的作用,沒有實際意義,和搜索“test1:a_b”的意義壹樣,搜索字符串分隔為兩個token[test1和a_b]去匹配。

3)使用關鍵字term搜索“test1?.,“也可以匹配,相當於使用token”test1“去搜索

4)搜索“a“,就沒有匹配結果,源字符串分隔後的token中沒有“a”

存儲字符串:“123;456 test”,分詞後的term為:[123;456、test]

1) 查詢“123”是沒有返回結果的

2) 查詢“123:456”是沒有返回結果的

3) 查詢“123;456”是有結果

4) 查詢“.123;456#”是有結果

參考: http://unicode.org/reports/tr29/

除了漢字外的所有字符都是分隔符,每個字都會作為壹個term。因此在搜索中,存在除了漢字以為的字符都不起任何作用,不會作為匹配字符.

  • 上一篇:Linux裏面chmod和chown命令區別是什麽?
  • 下一篇:釣小魚用什麽型號的鉤
  • copyright 2024編程學習大全網