elasticsearch 建立索引
建立mapping的過程
介紹:分詞器(analyzer) 包括一個分解器(tokenizer)和多個詞元過濾器(filter),詞元過濾器的作是對分詞器提取的詞元進一步處理,比如轉成小寫,使用edge_ngram,同義詞等,處理之後成為索引詞(Term),文件正包含了幾個這樣的term成為Frequency(詞頻)
分解器(tokenizer): 型別有:standard tokenizer,Edge NGram tokenizer,Keyword Tokenizer,Lowercase Tokenizer,NGram Tokenizer,pinyin等
1,如果對於需求比較複雜的,比如說要拼音分詞,這個是要建在settings中
PUT XXX-20181109
{
"settings" {
“numbers_of_shards”:3,"number_of_replicas":1,"analysis"{
}
}
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我們說過:"你只能找到存在於倒排索引中的詞條"。儘管prefix,wildcard以及regexp查詢證明了上面的說法並不是一定正確,但是執行一個基於單個詞條的查詢會比遍歷詞條列表來得到匹配的詞條要更快是毫無疑問的。為了部分匹配而提前準備你的資料能夠增加搜尋效能。
在索引期間準別數據意味著選擇正確的分析鏈(Analysis Chain),為了部分匹配我們選擇的工具叫做n-gram。一個n-gram可以被想象成一個單詞上的滑動視窗(Moving Window)。n表示的是長度。如果我們對單詞quick得到n-gram,結果取決於選擇的長度:
- 長度1(unigram): [ q, u, i, c, k ]
- 長度2(bigram): [ qu, ui, ic, ck ]
- 長度3(trigram): [ qui, uic, ick ]
- 長度4(four-gram):[ quic, uick ]
- 長度5(five-gram):[ quick ]
單純的n-grams對於匹配單詞中的某一部分是有用的,在複合單詞的ngrams中我們會用到它。然而,對於即時搜尋,我們使用了一種特殊的n-grams,被稱為邊緣n-grams(Edge n-grams)。邊緣n-grams會將起始點放在單詞的開頭處。單詞quick的邊緣n-gram如下所示:
- q
- qu
- qui
- quic
- quick
你也許注意到它遵循了使用者在搜尋"quick"時的輸入形式。換言之,對於即時搜尋而言它們是非常完美的詞條。
-----------------------------------------------------------------------
可能要自定義一個分詞器:
準備索引
第一步是配置一個自定義的edge_ngram詞條過濾器,我們將它稱為autocomplete_filter:
{ "filter": { "prefix_filter": { "type": "edge_ngram", "min_gram": 2, "max_gram": 20 } } }
以上配置的作用是,對於此詞條過濾器接受的任何詞條,它都會產生一個最小長度為1,最大長度為20的邊緣ngram(Edge ngram)。
建立分解器
{ "tokenizer": { "my_pinyin": { "type": "pinyin", "padding_char": " " , "keep_ployphone": "true"} } }
keep_ployphone 主要是支援多音字
然後我們將該詞條過濾器配置在自定義的解析器中,該解析器名為name-pinyin-analyzer。
{ "analyzer": { "name-pinyin-analyzer": { "type": "custom", "tokenizer": "my_pinyin", "filter": [ "lowercase", "prefix_filter" ] } } }
自定義的拼音分詞器已經完工
2,建立mapping
建立mapping,設定IK分詞器和拼音分詞器
PUT / blog_website {
"mappings": {
"blogs": {
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word",
"fields”: {
"pinyin”: {
"type”:“ text”,
"analyzer”:“ name - pinyin - analyzer”
}
}
},
"content": {
"type": "text",
"analyzer": "ik_max_word"
},
"dt”: {
"type": "date",
"format": "yyyy-MM-dd||yyyyMMdd"
},
"id”: {
"type": "keyword"
}
}
}
}
2,同義詞
可以預定義一個檔案,同義詞檔案,然後查詢的時候,用or語句查詢,就可以同義詞查詢出所有的檔案
3,擴充套件詞,在nginx掛一個擴充套件詞,
4,安全過濾
5,多音字:工商銀行,行字是hang,xing