介紹:ElasticSearch 是一個基于 Lucene 的搜索服務器。它提供了一個分布式多用戶能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch 是用 Java 開發的,并作為Apache許可條款下的開放源碼發布,是當前流行的企業級搜索引擎。設計用于云計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。
Elasticsearch中,內置了很多分詞器(analyzers)。下面來進行比較下系統默認分詞器和常用的中文分詞器之間的區別。
系統默認分詞器:
1、standard 分詞器
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-standard-analyzer.html
如何使用:http://www.yiibai.com/lucene/lucene\_standardanalyzer.html
英文的處理能力同于StopAnalyzer.支持中文采用的方法為單字切分。他會將詞匯單元轉換成小寫形式,并去除停用詞和標點符號。
~~~
/**StandardAnalyzer分析器*/
public void standardAnalyzer(String msg){
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);
this.getTokens(analyzer, msg);
~~~
2、simple 分詞器
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-simple-analyzer.html
如何使用:?http://www.yiibai.com/lucene/lucene\_simpleanalyzer.html
功能強于WhitespaceAnalyzer, 首先會通過非字母字符來分割文本信息,然后將詞匯單元統一為小寫形式。該分析器會去掉數字類型的字符。
~~~
/**SimpleAnalyzer分析器*/
public void simpleAnalyzer(String msg){
SimpleAnalyzer analyzer = new SimpleAnalyzer(Version.LUCENE_36);
this.getTokens(analyzer, msg);
~~~
3、Whitespace 分詞器
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-whitespace-analyzer.html
如何使用:http://www.yiibai.com/lucene/lucene\_whitespaceanalyzer.html
僅僅是去除空格,對字符沒有lowcase化,不支持中文; 并且不對生成的詞匯單元進行其他的規范化處理。
~~~
/**WhitespaceAnalyzer分析器*/
public void whitespaceAnalyzer(String msg){
WhitespaceAnalyzer analyzer = new WhitespaceAnalyzer(Version.LUCENE_36);
this.getTokens(analyzer, msg);
}
~~~
4、Stop 分詞器
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-stop-analyzer.html
如何使用:http://www.yiibai.com/lucene/lucene\_stopanalyzer.html
StopAnalyzer的功能超越了SimpleAnalyzer,在SimpleAnalyzer的基礎上增加了去除英文中的常用單詞(如the,a等),也可以更加自己的需要設置常用單詞;不支持中文
~~~
/**StopAnalyzer分析器*/
public void stopAnalyzer(String msg){
StopAnalyzer analyzer = new StopAnalyzer(Version.LUCENE_36);
this.getTokens(analyzer, msg);
}
~~~
5、keyword 分詞器
KeywordAnalyzer把整個輸入作為一個單獨詞匯單元,方便特殊類型的文本進行索引和檢索。針對郵政編碼,地址等文本信息使用關鍵詞分詞器進行索引項建立非常方便。
6、pattern 分詞器
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-pattern-analyzer.html
一個pattern類型的analyzer可以通過正則表達式將文本分成"terms"(經過token Filter 后得到的東西 )。接受如下設置:
一個 pattern analyzer 可以做如下的屬性設置:
lowercaseterms是否是小寫. 默認為 true 小寫.pattern正則表達式的pattern, 默認是 \\W+.flags正則表達式的flagsstopwords一個用于初始化stop filter的需要stop 單詞的列表.默認單詞是空的列表
7、language 分詞器
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lang-analyzer.html
一個用于解析特殊語言文本的analyzer集合。( arabic,armenian, basque, brazilian, bulgarian, catalan, cjk, czech, danish, dutch, english, finnish, french,galician, german, greek, hindi, hungarian, indonesian, irish, italian, latvian, lithuanian, norwegian,persian, portuguese, romanian, russian, sorani, spanish, swedish, turkish, thai.)可惜沒有中文。不予考慮
8、snowball 分詞器
一個snowball類型的analyzer是由standard tokenizer和standard filter、lowercase filter、stop filter、snowball filter這四個filter構成的。
snowball analyzer 在Lucene中通常是不推薦使用的。
9、Custom 分詞器
是自定義的analyzer。允許多個零到多個tokenizer,零到多個 Char Filters. custom analyzer 的名字不能以 "\_"開頭.
The following are settings that can be set for a custom analyzer type:
SettingDescriptiontokenizer通用的或者注冊的tokenizer.filter通用的或者注冊的token filterschar\_filter通用的或者注冊的 character filtersposition\_increment\_gap距離查詢時,最大允許查詢的距離,默認是100
自定義的模板:
[](javascript:void(0); "復制代碼")
~~~
index :
analysis :
analyzer :
myAnalyzer2 :
type : custom
tokenizer : myTokenizer1
filter : [myTokenFilter1, myTokenFilter2]
char_filter : [my_html]
position_increment_gap: 256
tokenizer :
myTokenizer1 :
type : standard
max_token_length : 900
filter :
myTokenFilter1 :
type : stop
stopwords : [stop1, stop2, stop3, stop4]
myTokenFilter2 :
type : length
min : 0
max : 2000
char_filter :
my_html :
type : html_strip
escaped_tags : [xxx, yyy]
read_ahead : 1024
~~~
[](javascript:void(0); "復制代碼")
### 10、fingerprint 分詞器
[https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-fingerprint-analyzer.html](https://link.zhihu.com/?target=https%3A//www.elastic.co/guide/en/elasticsearch/reference/current/analysis-fingerprint-analyzer.html)
* * *
中文分詞器:
1、ik-analyzer
https://github.com/wks/ik-analyzer
IKAnalyzer是一個開源的,基于java語言開發的輕量級的中文分詞工具包。
采用了特有的“正向迭代最細粒度切分算法“,支持細粒度和最大詞長兩種切分模式;具有83萬字/秒(1600KB/S)的高速處理能力。
采用了多子處理器分析模式,支持:英文字母、數字、中文詞匯等分詞處理,兼容韓文、日文字符
優化的詞典存儲,更小的內存占用。支持用戶詞典擴展定義
針對Lucene全文檢索優化的查詢分析器IKQueryParser(作者吐血推薦);引入簡單搜索表達式,采用歧義分析算法優化查詢關鍵字的搜索排列組合,能極大的提高Lucene檢索的命中率。
Maven用法:
~~~
<dependency>
<groupId>org.wltea.ik-analyzer</groupId>
<artifactId>ik-analyzer</artifactId>
<version>3.2.8</version>
</dependency>
~~~
在IK Analyzer加入Maven Central Repository之前,你需要手動安裝,安裝到本地的repository,或者上傳到自己的Maven repository服務器上。
要安裝到本地Maven repository,使用如下命令,將自動編譯,打包并安裝: mvn install -Dmaven.test.skip=true
Elasticsearch添加中文分詞
安裝IK分詞插件
https://github.com/medcl/elasticsearch-analysis-ik
進入elasticsearch-analysis-ik-master
更多安裝請參考博客:
1、為elastic添加中文分詞:?http://blog.csdn.net/dingzfang/article/details/42776693
2、如何在Elasticsearch中安裝中文分詞器(IK+pinyin):http://www.cnblogs.com/xing901022/p/5910139.html
3、Elasticsearch 中文分詞器 IK 配置和使用:?http://blog.csdn.net/jam00/article/details/52983056
ik 帶有兩個分詞器
ik\_max\_word:會將文本做最細粒度的拆分;盡可能多的拆分出詞語
ik\_smart:會做最粗粒度的拆分;已被分出的詞語將不會再次被其它詞語占有
區別:
[](javascript:void(0); "復制代碼")
~~~
# ik_max_word
curl -XGET 'http://localhost:9200/_analyze?pretty&analyzer=ik_max_word' -d '聯想是全球最大的筆記本廠商'
#返回
{
"tokens" : [
{
"token" : "聯想",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "是",
"start_offset" : 2,
"end_offset" : 3,
"type" : "CN_CHAR",
"position" : 1
},
{
"token" : "全球",
"start_offset" : 3,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 2
},
{
"token" : "最大",
"start_offset" : 5,
"end_offset" : 7,
"type" : "CN_WORD",
"position" : 3
},
{
"token" : "的",
"start_offset" : 7,
"end_offset" : 8,
"type" : "CN_CHAR",
"position" : 4
},
{
"token" : "筆記本",
"start_offset" : 8,
"end_offset" : 11,
"type" : "CN_WORD",
"position" : 5
},
{
"token" : "筆記",
"start_offset" : 8,
"end_offset" : 10,
"type" : "CN_WORD",
"position" : 6
},
{
"token" : "本廠",
"start_offset" : 10,
"end_offset" : 12,
"type" : "CN_WORD",
"position" : 7
},
{
"token" : "廠商",
"start_offset" : 11,
"end_offset" : 13,
"type" : "CN_WORD",
"position" : 8
}
]
}
# ik_smart
curl -XGET 'http://localhost:9200/_analyze?pretty&analyzer=ik_smart' -d '聯想是全球最大的筆記本廠商'
# 返回
{
"tokens" : [
{
"token" : "聯想",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "是",
"start_offset" : 2,
"end_offset" : 3,
"type" : "CN_CHAR",
"position" : 1
},
{
"token" : "全球",
"start_offset" : 3,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 2
},
{
"token" : "最大",
"start_offset" : 5,
"end_offset" : 7,
"type" : "CN_WORD",
"position" : 3
},
{
"token" : "的",
"start_offset" : 7,
"end_offset" : 8,
"type" : "CN_CHAR",
"position" : 4
},
{
"token" : "筆記本",
"start_offset" : 8,
"end_offset" : 11,
"type" : "CN_WORD",
"position" : 5
},
{
"token" : "廠商",
"start_offset" : 11,
"end_offset" : 13,
"type" : "CN_WORD",
"position" : 6
}
]
}
~~~
[](javascript:void(0); "復制代碼")
下面我們來創建一個索引,使用 ik 創建一個名叫 iktest 的索引,設置它的分析器用 ik ,分詞器用 ik\_max\_word,并創建一個 article 的類型,里面有一個 subject 的字段,指定其使用 ik\_max\_word 分詞器
[](javascript:void(0); "復制代碼")
~~~
curl -XPUT 'http://localhost:9200/iktest?pretty' -d '{
"settings" : {
"analysis" : {
"analyzer" : {
"ik" : {
"tokenizer" : "ik_max_word"
}
}
}
},
"mappings" : {
"article" : {
"dynamic" : true,
"properties" : {
"subject" : {
"type" : "string",
"analyzer" : "ik_max_word"
}
}
}
}
}'
~~~
[](javascript:void(0); "復制代碼")
批量添加幾條數據,這里我指定元數據 \_id 方便查看,subject 內容為我隨便找的幾條新聞的標題
[](javascript:void(0); "復制代碼")
~~~
curl -XPOST http://localhost:9200/iktest/article/_bulk?pretty -d '
{ "index" : { "_id" : "1" } }
{"subject" : ""閨蜜"崔順實被韓檢方傳喚 韓總統府促徹查真相" }
{ "index" : { "_id" : "2" } }
{"subject" : "韓舉行"護國訓練" 青瓦臺:決不許國家安全出問題" }
{ "index" : { "_id" : "3" } }
{"subject" : "媒體稱FBI已經取得搜查令 檢視希拉里電郵" }
{ "index" : { "_id" : "4" } }
{"subject" : "村上春樹獲安徒生獎 演講中談及歐洲排外問題" }
{ "index" : { "_id" : "5" } }
{"subject" : "希拉里團隊炮轟FBI 參院民主黨領袖批其“違法”" }
'
~~~
[](javascript:void(0); "復制代碼")
查詢 “希拉里和韓國”
[](javascript:void(0); "復制代碼")
~~~
curl -XPOST http://localhost:9200/iktest/article/_search?pretty -d'
{
"query" : { "match" : { "subject" : "希拉里和韓國" }},
"highlight" : {
"pre_tags" : ["<font color='red'>"],
"post_tags" : ["</font>"],
"fields" : {
"subject" : {}
}
}
}
'
#返回
{
"took" : 113,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 4,
"max_score" : 0.034062363,
"hits" : [ {
"_index" : "iktest",
"_type" : "article",
"_id" : "2",
"_score" : 0.034062363,
"_source" : {
"subject" : "韓舉行"護國訓練" 青瓦臺:決不許國家安全出問題"
},
"highlight" : {
"subject" : [ "<font color=red>韓</font>舉行"護<font color=red>國</font>訓練" 青瓦臺:決不許國家安全出問題" ]
}
}, {
"_index" : "iktest",
"_type" : "article",
"_id" : "3",
"_score" : 0.0076681254,
"_source" : {
"subject" : "媒體稱FBI已經取得搜查令 檢視希拉里電郵"
},
"highlight" : {
"subject" : [ "媒體稱FBI已經取得搜查令 檢視<font color=red>希拉里</font>電郵" ]
}
}, {
"_index" : "iktest",
"_type" : "article",
"_id" : "5",
"_score" : 0.006709609,
"_source" : {
"subject" : "希拉里團隊炮轟FBI 參院民主黨領袖批其“違法”"
},
"highlight" : {
"subject" : [ "<font color=red>希拉里</font>團隊炮轟FBI 參院民主黨領袖批其“違法”" ]
}
}, {
"_index" : "iktest",
"_type" : "article",
"_id" : "1",
"_score" : 0.0021509775,
"_source" : {
"subject" : ""閨蜜"崔順實被韓檢方傳喚 韓總統府促徹查真相"
},
"highlight" : {
"subject" : [ ""閨蜜"崔順實被<font color=red>韓</font>檢方傳喚 <font color=red>韓</font>總統府促徹查真相" ]
}
} ]
}
}
~~~
[](javascript:void(0); "復制代碼")
這里用了高亮屬性 highlight,直接顯示到 html 中,被匹配到的字或詞將以紅色突出顯示。若要用過濾搜索,直接將 match 改為 term 即可
熱詞更新配置
網絡詞語日新月異,如何讓新出的網絡熱詞(或特定的詞語)實時的更新到我們的搜索當中呢
先用 ik 測試一下
[](javascript:void(0); "復制代碼")
~~~
curl -XGET 'http://localhost:9200/_analyze?pretty&analyzer=ik_max_word' -d '
成龍原名陳港生
'
#返回
{
"tokens" : [ {
"token" : "成龍",
"start_offset" : 1,
"end_offset" : 3,
"type" : "CN_WORD",
"position" : 0
}, {
"token" : "原名",
"start_offset" : 3,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 1
}, {
"token" : "陳",
"start_offset" : 5,
"end_offset" : 6,
"type" : "CN_CHAR",
"position" : 2
}, {
"token" : "港",
"start_offset" : 6,
"end_offset" : 7,
"type" : "CN_WORD",
"position" : 3
}, {
"token" : "生",
"start_offset" : 7,
"end_offset" : 8,
"type" : "CN_CHAR",
"position" : 4
} ]
}
~~~
[](javascript:void(0); "復制代碼")
ik 的主詞典中沒有”陳港生” 這個詞,所以被拆分了。 現在我們來配置一下
修改 IK 的配置文件 :ES 目錄/plugins/ik/config/ik/IKAnalyzer.cfg.xml
修改如下:
[](javascript:void(0); "復制代碼")
~~~
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 擴展配置</comment>
<!--用戶可以在這里配置自己的擴展字典 -->
<entry key="ext_dict">custom/mydict.dic;custom/single_word_low_freq.dic</entry>
<!--用戶可以在這里配置自己的擴展停止詞字典-->
<entry key="ext_stopwords">custom/ext_stopword.dic</entry>
<!--用戶可以在這里配置遠程擴展字典 -->
<entry key="remote_ext_dict">http://192.168.1.136/hotWords.php</entry>
<!--用戶可以在這里配置遠程擴展停止詞字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
~~~
[](javascript:void(0); "復制代碼")
這里我是用的是遠程擴展字典,因為可以使用其他程序調用更新,且不用重啟 ES,很方便;當然使用自定義的 mydict.dic 字典也是很方便的,一行一個詞,自己加就可以了
既然是遠程詞典,那么就要是一個可訪問的鏈接,可以是一個頁面,也可以是一個txt的文檔,但要保證輸出的內容是 utf-8 的格式
hotWords.php 的內容
[](javascript:void(0); "復制代碼")
~~~
$s = <<<'EOF'
陳港生
元樓
藍瘦
EOF;
header('Last-Modified: '.gmdate('D, d M Y H:i:s', time()).' GMT', true, 200);
header('ETag: "5816f349-19"');
echo $s;
~~~
[](javascript:void(0); "復制代碼")
ik 接收兩個返回的頭部屬性 Last-Modified 和 ETag,只要其中一個有變化,就會觸發更新,ik 會每分鐘獲取一次 重啟 Elasticsearch ,查看啟動記錄,看到了三個詞已被加載進來
再次執行上面的請求,返回, 就可以看到 ik 分詞器已經匹配到了 “陳港生” 這個詞,同理一些關于我們公司的專有名字(例如:永輝、永輝超市、永輝云創、云創 .... )也可以自己手動添加到字典中去。
2、結巴中文分詞
特點:
1、支持三種分詞模式:
精確模式,試圖將句子最精確地切開,適合文本分析;
全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義;
搜索引擎模式,在精確模式的基礎上,對長詞再次切分,提高召回率,適合用于搜索引擎分詞。
2、支持繁體分詞
3、支持自定義詞典
3、THULAC
THULAC(THU Lexical Analyzer for Chinese)由清華大學自然語言處理與社會人文計算實驗室研制推出的一套中文詞法分析工具包,具有中文分詞和詞性標注功能。THULAC具有如下幾個特點:
能力強。利用我們集成的目前世界上規模最大的人工分詞和詞性標注中文語料庫(約含5800萬字)訓練而成,模型標注能力強大。
準確率高。該工具包在標準數據集Chinese Treebank(CTB5)上分詞的F1值可達97.3%,詞性標注的F1值可達到92.9%,與該數據集上最好方法效果相當。
速度較快。同時進行分詞和詞性標注速度為300KB/s,每秒可處理約15萬字。只進行分詞速度可達到1.3MB/s。
中文分詞工具thulac4j發布
1、規范化分詞詞典,并去掉一些無用詞;
2、重寫DAT(雙數組Trie樹)的構造算法,生成的DAT size減少了8%左右,從而節省了內存;
3、優化分詞算法,提高了分詞速率。
~~~
<dependency>
<groupId>io.github.yizhiru</groupId>
<artifactId>thulac4j</artifactId>
<version>${thulac4j.version}</version>
</dependency>
~~~
[http://www.cnblogs.com/en-heng/p/6526598.html](https://link.zhihu.com/?target=http%3A//www.cnblogs.com/en-heng/p/6526598.html)
thulac4j支持兩種分詞模式:
SegOnly模式,只分詞沒有詞性標注;
SegPos模式,分詞兼有詞性標注。
[](javascript:void(0); "復制代碼")
~~~
// SegOnly mode
String sentence = "滔滔的流水,向著波士頓灣無聲逝去";
SegOnly seg = new SegOnly("models/seg_only.bin");
System.out.println(seg.segment(sentence));
// [滔滔, 的, 流水, ,, 向著, 波士頓灣, 無聲, 逝去]
// SegPos mode
SegPos pos = new SegPos("models/seg_pos.bin");
System.out.println(pos.segment(sentence));
//[滔滔/a, 的/u, 流水/n, ,/w, 向著/p, 波士頓灣/ns, 無聲/v, 逝去/v]
~~~
[](javascript:void(0); "復制代碼")
4、NLPIR
中科院計算所 NLPIR:http://ictclas.nlpir.org/nlpir/?(可直接在線分析中文)
下載地址:https://github.com/NLPIR-team/NLPIR
中科院分詞系統(NLPIR)JAVA簡易教程:?http://www.cnblogs.com/wukongjiuwo/p/4092480.html
5、ansj分詞器
https://github.com/NLPchina/ansj\_seg
這是一個基于n-Gram+CRF+HMM的中文分詞的java實現.
分詞速度達到每秒鐘大約200萬字左右(mac air下測試),準確率能達到96%以上
目前實現了.中文分詞. 中文姓名識別 .
用戶自定義詞典,關鍵字提取,自動摘要,關鍵字標記等功能 可以應用到自然語言處理等方面,適用于對分詞效果要求高的各種項目.
maven 引入:
~~~
<dependency>
<groupId>org.ansj</groupId>
<artifactId>ansj_seg</artifactId>
<version>5.1.1</version>
</dependency>
~~~
調用demo
~~~
String str = "歡迎使用ansj_seg,(ansj中文分詞)在這里如果你遇到什么問題都可以聯系我.我一定盡我所能.幫助大家.ansj_seg更快,更準,更自由!" ;
System.out.println(ToAnalysis.parse(str));
歡迎/v,使用/v,ansj/en,_,seg/en,,,(,ansj/en,中文/nz,分詞/n,),在/p,這里/r,如果/c,你/r,遇到/v,什么/r,問題/n,都/d,可以/v,聯系/v,我/r,./m,我/r,一定/d,盡我所能/l,./m,幫助/v,大家/r,./m,ansj/en,_,seg/en,更快/d,,,更/d,準/a,,,更/d,自由/a,!
~~~
6、哈工大的LTP
https://github.com/HIT-SCIR/ltp
LTP制定了基于XML的語言處理結果表示,并在此基礎上提供了一整套自底向上的豐富而且高效的中文語言處理模塊(包括詞法、句法、語義等6項中文處理核心技術),以及基于動態鏈接庫(Dynamic Link Library, DLL)的應用程序接口、可視化工具,并且能夠以網絡服務(Web Service)的形式進行使用。
關于LTP的使用,請參考:?http://ltp.readthedocs.io/zh\_CN/latest/
7、庖丁解牛
下載地址:http://pan.baidu.com/s/1eQ88SZS
使用分為如下幾步:
配置dic文件: 修改paoding-analysis.jar中的paoding-dic-home.properties文件,將“#paoding.dic.home=dic”的注釋去掉,并配置成自己dic文件的本地存放路徑。eg:/home/hadoop/work/paoding-analysis-2.0.4-beta/dic
把Jar包導入到項目中: 將paoding-analysis.jar、commons-logging.jar、lucene-analyzers-2.2.0.jar和lucene-core-2.2.0.jar四個包導入到項目中,這時就可以在代碼片段中使用庖丁解牛工具提供的中文分詞技術,例如:
[](javascript:void(0); "復制代碼")
~~~
Analyzer analyzer = new PaodingAnalyzer(); //定義一個解析器
String text = "庖丁系統是個完全基于lucene的中文分詞系統,它就是重新建了一個analyzer,叫做PaodingAnalyzer,這個analyer的核心任務就是生成一個可以切詞TokenStream。"; <span style="font-family: Arial, Helvetica, sans-serif;">//待分詞的內容</span>
TokenStream tokenStream = analyzer.tokenStream(text, new StringReader(text)); //得到token序列的輸出流
try {
Token t;
while ((t = tokenStream.next()) != null)
{
System.out.println(t); //輸出每個token
}
} catch (IOException e) {
e.printStackTrace();
}
~~~
[](javascript:void(0); "復制代碼")
8、sogo在線分詞
sogo在線分詞采用了基于漢字標注的分詞方法,主要使用了線性鏈鏈CRF(Linear-chain CRF)模型。詞性標注模塊主要基于結構化線性模型(Structured Linear Model)
在線使用地址為:?http://www.sogou.com/labs/webservice/
9、word分詞
地址:?https://github.com/ysc/word
word分詞是一個Java實現的分布式的中文分詞組件,提供了多種基于詞典的分詞算法,并利用ngram模型來消除歧義。能準確識別英文、數字,以及日期、時間等數量詞,能識別人名、地名、組織機構名等未登錄詞。能通過自定義配置文件來改變組件行為,能自定義用戶詞庫、自動檢測詞庫變化、支持大規模分布式環境,能靈活指定多種分詞算法,能使用refine功能靈活控制分詞結果,還能使用詞頻統計、詞性標注、同義標注、反義標注、拼音標注等功能。提供了10種分詞算法,還提供了10種文本相似度算法,同時還無縫和Lucene、Solr、ElasticSearch、Luke集成。注意:word1.3需要JDK1.8
maven 中引入依賴:
[](javascript:void(0); "復制代碼")
~~~
<dependencies>
<dependency>
<groupId>org.apdplat</groupId>
<artifactId>word</artifactId>
<version>1.3</version>
</dependency>
</dependencies>
~~~
[](javascript:void(0); "復制代碼")
ElasticSearch插件:
[](javascript:void(0); "復制代碼")
~~~
1、打開命令行并切換到elasticsearch的bin目錄
cd elasticsearch-2.1.1/bin
2、運行plugin腳本安裝word分詞插件:
./plugin install http://apdplat.org/word/archive/v1.4.zip
安裝的時候注意:
如果提示:
ERROR: failed to download
或者
Failed to install word, reason: failed to download
或者
ERROR: incorrect hash (SHA1)
則重新再次運行命令,如果還是不行,多試兩次
如果是elasticsearch1.x系列版本,則使用如下命令:
./plugin -u http://apdplat.org/word/archive/v1.3.1.zip -i word
3、修改文件elasticsearch-2.1.1/config/elasticsearch.yml,新增如下配置:
index.analysis.analyzer.default.type : "word"
index.analysis.tokenizer.default.type : "word"
4、啟動ElasticSearch測試效果,在Chrome瀏覽器中訪問:
http://localhost:9200/_analyze?analyzer=word&text=楊尚川是APDPlat應用級產品開發平臺的作者
5、自定義配置
修改配置文件elasticsearch-2.1.1/plugins/word/word.local.conf
6、指定分詞算法
修改文件elasticsearch-2.1.1/config/elasticsearch.yml,新增如下配置:
index.analysis.analyzer.default.segAlgorithm : "ReverseMinimumMatching"
index.analysis.tokenizer.default.segAlgorithm : "ReverseMinimumMatching"
這里segAlgorithm可指定的值有:
正向最大匹配算法:MaximumMatching
逆向最大匹配算法:ReverseMaximumMatching
正向最小匹配算法:MinimumMatching
逆向最小匹配算法:ReverseMinimumMatching
雙向最大匹配算法:BidirectionalMaximumMatching
雙向最小匹配算法:BidirectionalMinimumMatching
雙向最大最小匹配算法:BidirectionalMaximumMinimumMatching
全切分算法:FullSegmentation
最少詞數算法:MinimalWordCount
最大Ngram分值算法:MaxNgramScore
如不指定,默認使用雙向最大匹配算法:BidirectionalMaximumMatching
~~~
[](javascript:void(0); "復制代碼")
10、jcseg分詞器
https://code.google.com/archive/p/jcseg/
11、stanford分詞器
Stanford大學的一個開源分詞工具,目前已支持漢語。
首先,去【1】下載Download Stanford Word Segmenter version 3.5.2,取得里面的 data 文件夾,放在maven project的 src/main/resources 里。
然后,maven依賴添加:
[](javascript:void(0); "復制代碼")
~~~
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<corenlp.version>3.6.0</corenlp.version>
</properties>
<dependencies>
<dependency>
<groupId>edu.stanford.nlp</groupId>
<artifactId>stanford-corenlp</artifactId>
<version>${corenlp.version}</version>
</dependency>
<dependency>
<groupId>edu.stanford.nlp</groupId>
<artifactId>stanford-corenlp</artifactId>
<version>${corenlp.version}</version>
<classifier>models</classifier>
</dependency>
<dependency>
<groupId>edu.stanford.nlp</groupId>
<artifactId>stanford-corenlp</artifactId>
<version>${corenlp.version}</version>
<classifier>models-chinese</classifier>
</dependency>
</dependencies>
~~~
[](javascript:void(0); "復制代碼")
測試:
[](javascript:void(0); "復制代碼")
~~~
import java.util.Properties;
import edu.stanford.nlp.ie.crf.CRFClassifier;
public class CoreNLPSegment {
private static CoreNLPSegment instance;
private CRFClassifier classifier;
private CoreNLPSegment(){
Properties props = new Properties();
props.setProperty("sighanCorporaDict", "data");
props.setProperty("serDictionary", "data/dict-chris6.ser.gz");
props.setProperty("inputEncoding", "UTF-8");
props.setProperty("sighanPostProcessing", "true");
classifier = new CRFClassifier(props);
classifier.loadClassifierNoExceptions("data/ctb.gz", props);
classifier.flags.setProperties(props);
}
public static CoreNLPSegment getInstance() {
if (instance == null) {
instance = new CoreNLPSegment();
}
return instance;
}
public String[] doSegment(String data) {
return (String[]) classifier.segmentString(data).toArray();
}
public static void main(String[] args) {
String sentence = "他和我在學校里常打桌球。";
String ret[] = CoreNLPSegment.getInstance().doSegment(sentence);
for (String str : ret) {
System.out.println(str);
}
}
}
~~~
[](javascript:void(0); "復制代碼")
12、Smartcn
Smartcn為Apache2.0協議的開源中文分詞系統,Java語言編寫,修改的中科院計算所ICTCLAS分詞系統。很早以前看到Lucene上多了一個中文分詞的contribution,當時只是簡單的掃了一下.class文件的文件名,通過文件名可以看得出又是一個改的ICTCLAS的分詞系統。
http://lucene.apache.org/core/5\_1\_0/analyzers-smartcn/org/apache/lucene/analysis/cn/smart/SmartChineseAnalyzer.html
13、pinyin 分詞器
pinyin分詞器可以讓用戶輸入拼音,就能查找到相關的關鍵詞。比如在某個商城搜索中,輸入yonghui,就能匹配到永輝。這樣的體驗還是非常好的。
pinyin分詞器的安裝與IK是一樣的。下載地址:https://github.com/medcl/elasticsearch-analysis-pinyin
一些參數請參考 GitHub 的 readme 文檔。
這個分詞器在1.8版本中,提供了兩種分詞規則:
pinyin,就是普通的把漢字轉換成拼音;
pinyin\_first\_letter,提取漢字的拼音首字母
使用:
1.Create a index with custom pinyin analyzer
[](javascript:void(0); "復制代碼")
~~~
curl -XPUT http://localhost:9200/medcl/ -d'
{
"index" : {
"analysis" : {
"analyzer" : {
"pinyin_analyzer" : {
"tokenizer" : "my_pinyin"
}
},
"tokenizer" : {
"my_pinyin" : {
"type" : "pinyin",
"keep_separate_first_letter" : false,
"keep_full_pinyin" : true,
"keep_original" : true,
"limit_first_letter_length" : 16,
"lowercase" : true,
"remove_duplicated_term" : true
}
}
}
}
}'
~~~
[](javascript:void(0); "復制代碼")
2.Test Analyzer, analyzing a chinese name, such as 劉德華
~~~
http://localhost:9200/medcl/_analyze?text=%e5%88%98%e5%be%b7%e5%8d%8e&analyzer=pinyin_analyzer
~~~
[](javascript:void(0); "復制代碼")
~~~
{
"tokens" : [
{
"token" : "liu",
"start_offset" : 0,
"end_offset" : 1,
"type" : "word",
"position" : 0
},
{
"token" : "de",
"start_offset" : 1,
"end_offset" : 2,
"type" : "word",
"position" : 1
},
{
"token" : "hua",
"start_offset" : 2,
"end_offset" : 3,
"type" : "word",
"position" : 2
},
{
"token" : "劉德華",
"start_offset" : 0,
"end_offset" : 3,
"type" : "word",
"position" : 3
},
{
"token" : "ldh",
"start_offset" : 0,
"end_offset" : 3,
"type" : "word",
"position" : 4
}
]
}
~~~
[](javascript:void(0); "復制代碼")
3.Create mapping
[](javascript:void(0); "復制代碼")
~~~
curl -XPOST http://localhost:9200/medcl/folks/_mapping -d'
{
"folks": {
"properties": {
"name": {
"type": "keyword",
"fields": {
"pinyin": {
"type": "text",
"store": "no",
"term_vector": "with_offsets",
"analyzer": "pinyin_analyzer",
"boost": 10
}
}
}
}
}
}'
~~~
[](javascript:void(0); "復制代碼")
4.Indexing
~~~
curl -XPOST http://localhost:9200/medcl/folks/andy -d'{"name":"劉德華"}'
~~~
5.Let's search
~~~
http://localhost:9200/medcl/folks/_search?q=name:%E5%88%98%E5%BE%B7%E5%8D%8E
curl http://localhost:9200/medcl/folks/_search?q=name.pinyin:%e5%88%98%e5%be%b7
curl http://localhost:9200/medcl/folks/_search?q=name.pinyin:liu
curl http://localhost:9200/medcl/folks/_search?q=name.pinyin:ldh
curl http://localhost:9200/medcl/folks/_search?q=name.pinyin:de+hua
~~~
6.Using Pinyin-TokenFilter
[](javascript:void(0); "復制代碼")
~~~
curl -XPUT http://localhost:9200/medcl1/ -d'
{
"index" : {
"analysis" : {
"analyzer" : {
"user_name_analyzer" : {
"tokenizer" : "whitespace",
"filter" : "pinyin_first_letter_and_full_pinyin_filter"
}
},
"filter" : {
"pinyin_first_letter_and_full_pinyin_filter" : {
"type" : "pinyin",
"keep_first_letter" : true,
"keep_full_pinyin" : false,
"keep_none_chinese" : true,
"keep_original" : false,
"limit_first_letter_length" : 16,
"lowercase" : true,
"trim_whitespace" : true,
"keep_none_chinese_in_first_letter" : true
}
}
}
}
}'
~~~
[](javascript:void(0); "復制代碼")
Token Test:劉德華 張學友 郭富城 黎明 四大天王
~~~
curl -XGET http://localhost:9200/medcl1/_analyze?text=%e5%88%98%e5%be%b7%e5%8d%8e+%e5%bc%a0%e5%ad%a6%e5%8f%8b+%e9%83%ad%e5%af%8c%e5%9f%8e+%e9%bb%8e%e6%98%8e+%e5%9b%9b%e5%a4%a7%e5%a4%a9%e7%8e%8b&analyzer=user_name_analyzer
~~~
[](javascript:void(0); "復制代碼")
~~~
{
"tokens" : [
{
"token" : "ldh",
"start_offset" : 0,
"end_offset" : 3,
"type" : "word",
"position" : 0
},
{
"token" : "zxy",
"start_offset" : 4,
"end_offset" : 7,
"type" : "word",
"position" : 1
},
{
"token" : "gfc",
"start_offset" : 8,
"end_offset" : 11,
"type" : "word",
"position" : 2
},
{
"token" : "lm",
"start_offset" : 12,
"end_offset" : 14,
"type" : "word",
"position" : 3
},
{
"token" : "sdtw",
"start_offset" : 15,
"end_offset" : 19,
"type" : "word",
"position" : 4
}
]
}
~~~
[](javascript:void(0); "復制代碼")
7.Used in phrase query
(1)、
[](javascript:void(0); "復制代碼")
~~~
PUT /medcl/
{
"index" : {
"analysis" : {
"analyzer" : {
"pinyin_analyzer" : {
"tokenizer" : "my_pinyin"
}
},
"tokenizer" : {
"my_pinyin" : {
"type" : "pinyin",
"keep_first_letter":false,
"keep_separate_first_letter" : false,
"keep_full_pinyin" : true,
"keep_original" : false,
"limit_first_letter_length" : 16,
"lowercase" : true
}
}
}
}
}
GET /medcl/folks/_search
{
"query": {"match_phrase": {
"name.pinyin": "劉德華"
}}
}
~~~
[](javascript:void(0); "復制代碼")
(2)、
[](javascript:void(0); "復制代碼")
~~~
PUT /medcl/
{
"index" : {
"analysis" : {
"analyzer" : {
"pinyin_analyzer" : {
"tokenizer" : "my_pinyin"
}
},
"tokenizer" : {
"my_pinyin" : {
"type" : "pinyin",
"keep_first_letter":false,
"keep_separate_first_letter" : true,
"keep_full_pinyin" : false,
"keep_original" : false,
"limit_first_letter_length" : 16,
"lowercase" : true
}
}
}
}
}
POST /medcl/folks/andy
{"name":"劉德華"}
GET /medcl/folks/_search
{
"query": {"match_phrase": {
"name.pinyin": "劉德h"
}}
}
GET /medcl/folks/_search
{
"query": {"match_phrase": {
"name.pinyin": "劉dh"
}}
}
GET /medcl/folks/_search
{
"query": {"match_phrase": {
"name.pinyin": "dh"
}}
}
~~~
[](javascript:void(0); "復制代碼")
14、Mmseg 分詞器
也支持 Elasticsearch
下載地址:https://github.com/medcl/elasticsearch-analysis-mmseg/releases?根據對應的版本進行下載
如何使用:
1、創建索引:
~~~
curl -XPUT http://localhost:9200/index
~~~
2、創建 mapping
[](javascript:void(0); "復制代碼")
~~~
curl -XPOST http://localhost:9200/index/fulltext/_mapping -d'
{
"properties": {
"content": {
"type": "text",
"term_vector": "with_positions_offsets",
"analyzer": "mmseg_maxword",
"search_analyzer": "mmseg_maxword"
}
}
}'
~~~
[](javascript:void(0); "復制代碼")
3.Indexing some docs
[](javascript:void(0); "復制代碼")
~~~
curl -XPOST http://localhost:9200/index/fulltext/1 -d'
{"content":"美國留給伊拉克的是個爛攤子嗎"}
'
curl -XPOST http://localhost:9200/index/fulltext/2 -d'
{"content":"公安部:各地校車將享最高路權"}
'
curl -XPOST http://localhost:9200/index/fulltext/3 -d'
{"content":"中韓漁警沖突調查:韓警平均每天扣1艘中國漁船"}
'
curl -XPOST http://localhost:9200/index/fulltext/4 -d'
{"content":"中國駐洛杉磯領事館遭亞裔男子槍擊 嫌犯已自首"}
'
~~~
[](javascript:void(0); "復制代碼")
4.Query with highlighting(查詢高亮)
[](javascript:void(0); "復制代碼")
~~~
curl -XPOST http://localhost:9200/index/fulltext/_search -d'
{
"query" : { "term" : { "content" : "中國" }},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}
'
~~~
[](javascript:void(0); "復制代碼")
5、結果:
[](javascript:void(0); "復制代碼")
~~~
{
"took": 14,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 2,
"hits": [
{
"_index": "index",
"_type": "fulltext",
"_id": "4",
"_score": 2,
"_source": {
"content": "中國駐洛杉磯領事館遭亞裔男子槍擊 嫌犯已自首"
},
"highlight": {
"content": [
"<tag1>中國</tag1>駐洛杉磯領事館遭亞裔男子槍擊 嫌犯已自首 "
]
}
},
{
"_index": "index",
"_type": "fulltext",
"_id": "3",
"_score": 2,
"_source": {
"content": "中韓漁警沖突調查:韓警平均每天扣1艘中國漁船"
},
"highlight": {
"content": [
"均每天扣1艘<tag1>中國</tag1>漁船 "
]
}
}
]
}
}
~~~
[](javascript:void(0); "復制代碼")
參考博客:
為elastic添加中文分詞:?http://blog.csdn.net/dingzfang/article/details/42776693
15、bosonnlp (玻森數據中文分析器)
下載地址:https://github.com/bosondata/elasticsearch-analysis-bosonnlp
如何使用:
運行 ElasticSearch 之前需要在 config 文件夾中修改 elasticsearch.yml 來定義使用玻森中文分析器,并填寫玻森 API\_TOKEN 以及玻森分詞 API 的地址,即在該文件結尾處添加:
[](javascript:void(0); "復制代碼")
~~~
index:
analysis:
analyzer:
bosonnlp:
type: bosonnlp
API_URL: http://api.bosonnlp.com/tag/analysis
# You MUST give the API_TOKEN value, otherwise it doesn't work
API_TOKEN: *PUT YOUR API TOKEN HERE*
# Please uncomment if you want to specify ANY ONE of the following
# areguments, otherwise the DEFAULT value will be used, i.e.,
# space_mode is 0,
# oov_level is 3,
# t2s is 0,
# special_char_conv is 0.
# More detials can be found in bosonnlp docs:
# http://docs.bosonnlp.com/tag.html
#
#
# space_mode: put your value here(range from 0-3)
# oov_level: put your value here(range from 0-4)
# t2s: put your value here(range from 0-1)
# special_char_conv: put your value here(range from 0-1)
~~~
[](javascript:void(0); "復制代碼")
需要注意的是
必須在 API\_URL 填寫給定的分詞地址以及在API\_TOKEN:PUT YOUR API TOKEN HERE中填寫給定的玻森數據API\_TOKEN,否則無法使用玻森中文分析器。該 API\_TOKEN 是注冊玻森數據賬號所獲得。
如果配置文件中已經有配置過其他的 analyzer,請直接在 analyzer 下如上添加 bosonnlp analyzer。
如果有多個 node 并且都需要 BosonNLP 的分詞插件,則每個 node 下的 yaml 文件都需要如上安裝和設置。
另外,玻森中文分詞還提供了4個參數(space\_mode,oov\_level,t2s,special\_char\_conv)可滿足不同的分詞需求。如果取默認值,則無需任何修改;否則,可取消對應參數的注釋并賦值。
測試:
建立 index
~~~
curl -XPUT 'localhost:9200/test'
~~~
測試分析器是否配置成功
~~~
curl -XGET 'localhost:9200/test/_analyze?analyzer=bosonnlp&pretty' -d '這是玻森數據分詞的測試'
~~~
結果
[](javascript:void(0); "復制代碼")
~~~
{
"tokens" : [ {
"token" : "這",
"start_offset" : 0,
"end_offset" : 1,
"type" : "word",
"position" : 0
}, {
"token" : "是",
"start_offset" : 1,
"end_offset" : 2,
"type" : "word",
"position" : 1
}, {
"token" : "玻森",
"start_offset" : 2,
"end_offset" : 4,
"type" : "word",
"position" : 2
}, {
"token" : "數據",
"start_offset" : 4,
"end_offset" : 6,
"type" : "word",
"position" : 3
}, {
"token" : "分詞",
"start_offset" : 6,
"end_offset" : 8,
"type" : "word",
"position" : 4
}, {
"token" : "的",
"start_offset" : 8,
"end_offset" : 9,
"type" : "word",
"position" : 5
}, {
"token" : "測試",
"start_offset" : 9,
"end_offset" : 11,
"type" : "word",
"position" : 6
} ]
}
~~~
[](javascript:void(0); "復制代碼")
配置 Token Filter
現有的 BosonNLP 分析器沒有內置 token filter,如果有過濾 Token 的需求,可以利用 BosonNLP Tokenizer 和 ES 提供的 token filter 搭建定制分析器。
步驟
配置定制的 analyzer 有以下三個步驟:
添加 BosonNLP tokenizer 在 elasticsearch.yml 文件中 analysis 下添加 tokenizer, 并在 tokenizer 中添加 BosonNLP tokenizer 的配置:
[](javascript:void(0); "復制代碼")
~~~
index:
analysis:
analyzer:
...
tokenizer:
bosonnlp:
type: bosonnlp
API_URL: http://api.bosonnlp.com/tag/analysis
# You MUST give the API_TOKEN value, otherwise it doesn't work
API_TOKEN: *PUT YOUR API TOKEN HERE*
# Please uncomment if you want to specify ANY ONE of the following
# areguments, otherwise the DEFAULT value will be used, i.e.,
# space_mode is 0,
# oov_level is 3,
# t2s is 0,
# special_char_conv is 0.
# More detials can be found in bosonnlp docs:
# http://docs.bosonnlp.com/tag.html
#
#
# space_mode: put your value here(range from 0-3)
# oov_level: put your value here(range from 0-4)
# t2s: put your value here(range from 0-1)
# special_char_conv: put your value here(range from 0-1)
~~~
[](javascript:void(0); "復制代碼")
添加 token filter
在 elasticsearch.yml 文件中 analysis 下添加 filter, 并在 filter 中添加所需 filter 的配置(下面例子中,我們以 lowercase filter 為例):
[](javascript:void(0); "復制代碼")
~~~
index:
analysis:
analyzer:
...
tokenizer:
...
filter:
lowercase:
type: lowercase
~~~
[](javascript:void(0); "復制代碼")
添加定制的 analyzer
在 elasticsearch.yml 文件中 analysis 下添加 analyzer, 并在 analyzer 中添加定制的 analyzer 的配置(下面例子中,我們把定制的 analyzer 命名為 filter\_bosonnlp):
[](javascript:void(0); "復制代碼")
~~~
index:
analysis:
analyzer:
...
filter_bosonnlp:
type: custom
tokenizer: bosonnlp
filter: [lowercase]
~~~
[](javascript:void(0); "復制代碼")
* * *
自定義分詞器
雖然Elasticsearch帶有一些現成的分析器,然而在分析器上Elasticsearch真正的強大之處在于,你可以通過在一個適合你的特定數據的設置之中組合字符過濾器、分詞器、詞匯單元過濾器來創建自定義的分析器。
字符過濾器:
字符過濾器 用來 整理 一個尚未被分詞的字符串。例如,如果我們的文本是HTML格式的,它會包含像或者這樣的HTML標簽,這些標簽是我們不想索引的。我們可以使用 html清除 字符過濾器 來移除掉所有的HTML標簽,并且像把Á轉換為相對應的Unicode字符 á 這樣,轉換HTML實體。
一個分析器可能有0個或者多個字符過濾器。
分詞器:
一個分析器 必須 有一個唯一的分詞器。 分詞器把字符串分解成單個詞條或者詞匯單元。 標準 分析器里使用的 標準 分詞器 把一個字符串根據單詞邊界分解成單個詞條,并且移除掉大部分的標點符號,然而還有其他不同行為的分詞器存在。
詞單元過濾器:
經過分詞,作為結果的 詞單元流 會按照指定的順序通過指定的詞單元過濾器 。
詞單元過濾器可以修改、添加或者移除詞單元。我們已經提到過 lowercase 和 stop 詞過濾器 ,但是在 Elasticsearch 里面還有很多可供選擇的詞單元過濾器。 詞干過濾器 把單詞 遏制 為 詞干。 ascii\_folding 過濾器移除變音符,把一個像 "très" 這樣的詞轉換為 "tres" 。 ngram 和 edge\_ngram 詞單元過濾器 可以產生 適合用于部分匹配或者自動補全的詞單元。
創建一個自定義分析器
我們可以在 analysis 下的相應位置設置字符過濾器、分詞器和詞單元過濾器:
[](javascript:void(0); "復制代碼")
~~~
PUT /my_index
{
"settings": {
"analysis": {
"char_filter": { ... custom character filters ... },
"tokenizer": { ... custom tokenizers ... },
"filter": { ... custom token filters ... },
"analyzer": { ... custom analyzers ... }
}
}
}
~~~
[](javascript:void(0); "復制代碼")
這個分析器可以做到下面的這些事:
1、使用 html清除 字符過濾器移除HTML部分。
2、使用一個自定義的 映射 字符過濾器把 & 替換為 "和" :
~~~
"char_filter": {
"&_to_and": {
"type": "mapping",
"mappings": [ "&=> and "]
}
}
~~~
3、使用 標準 分詞器分詞。
4、小寫詞條,使用 小寫 詞過濾器處理。
5、使用自定義 停止 詞過濾器移除自定義的停止詞列表中包含的詞:
~~~
"filter": {
"my_stopwords": {
"type": "stop",
"stopwords": [ "the", "a" ]
}
}
~~~
我們的分析器定義用我們之前已經設置好的自定義過濾器組合了已經定義好的分詞器和過濾器:
[](javascript:void(0); "復制代碼")
~~~
"analyzer": {
"my_analyzer": {
"type": "custom",
"char_filter": [ "html_strip", "&_to_and" ],
"tokenizer": "standard",
"filter": [ "lowercase", "my_stopwords" ]
}
}
~~~
[](javascript:void(0); "復制代碼")
匯總起來,完整的 創建索引 請求 看起來應該像這樣:
[](javascript:void(0); "復制代碼")
~~~
PUT /my_index
{
"settings": {
"analysis": {
"char_filter": {
"&_to_and": {
"type": "mapping",
"mappings": [ "&=> and "]
}},
"filter": {
"my_stopwords": {
"type": "stop",
"stopwords": [ "the", "a" ]
}},
"analyzer": {
"my_analyzer": {
"type": "custom",
"char_filter": [ "html_strip", "&_to_and" ],
"tokenizer": "standard",
"filter": [ "lowercase", "my_stopwords" ]
}}
}}}
~~~
[](javascript:void(0); "復制代碼")
索引被創建以后,使用 analyze API 來 測試這個新的分析器:
~~~
GET /my_index/_analyze?analyzer=my_analyzer
The quick & brown fox
~~~
下面的縮略結果展示出我們的分析器正在正確地運行:
[](javascript:void(0); "復制代碼")
~~~
{
"tokens" : [
{ "token" : "quick", "position" : 2 },
{ "token" : "and", "position" : 3 },
{ "token" : "brown", "position" : 4 },
{ "token" : "fox", "position" : 5 }
]
}
~~~
[](javascript:void(0); "復制代碼")
這個分析器現在是沒有多大用處的,除非我們告訴 Elasticsearch在哪里用上它。我們可以像下面這樣把這個分析器應用在一個 string 字段上:
[](javascript:void(0); "復制代碼")
~~~
PUT /my_index/_mapping/my_type
{
"properties": {
"title": {
"type": "string",
"analyzer": "my_analyzer"
}
}
}
~~~
[](javascript:void(0); "復制代碼")
最后,感謝原文作者!
- php開發
- 常用技巧
- 字符數組對象
- php換行替換,PHP替換回車換行符的三種方法
- PHP 數組轉字符串,與字符串轉數組
- php將img中的寬高刪除,PHP刪除HTML中寬高樣式的詳解
- php去除換行(回車換行)的三種方法
- php 過濾word 樣式
- php如何設置隨機數
- 2個比較經典的PHP加密解密函數分享
- php怎么去除小數點后多余的0
- php中判斷是一維數組還是二維數組的解決方案
- php 獲取數組中出現次數最多的值(重復最多的值)與出現的次數
- PHP過濾掉換行符、特殊空格、制表符等
- PHP中json_endoce轉義反斜杠的問題
- PHP過濾Emoji表情和特殊符號的方法
- PHP完美的提取鏈接正則
- php很牛的圖片采集
- 日期處理
- php 獲取今日、昨日、上周、本月的起始時間戳和結束時間戳的方法非常簡單
- PHP指定時間戳/日期加一天,一年,一周,一月
- 使用php 獲取時間今天明天昨天時間戳的詳解
- php獲得當月的節假日函數(包含周末,年度節假日)
- PHP獲取本月起始和截止時間戳
- php 獲取每月開始結束時間,php 獲取指定月份的開始結束時間戳
- PHP獲取今天,昨天,本月,上個月,本年 起始時間戳
- php、mysql查詢當天,本周,本月的用法
- php獲取兩個時間戳之間相隔多少天多少小時多少分多少秒
- 毫秒級時間戳和日期格式轉換
- php-倒計時
- 請求提交上傳
- php+put+post,Curl和PHP-如何通過PUT,POST,GET通過curl傳遞json
- PHP put提交和獲取數據
- PHP curl put方式上傳文件
- 數據導入導出
- PHP快速導入大量數據到數據庫的方法
- PHP快速導出百萬級數據到CSV或者EXCEL文件
- PHP解析大型Excel表格的庫:box/spout
- PHP導入(百萬級)Excel表格數據
- PHP如何切割excel大文件
- 使用 PHP_XLSXWriter 代替 PHPExcel 10W+ 數據秒級導出
- 安裝php擴展XLSXWriter
- 解決php導入excel表格時獲取日期變成浮點數的方法
- xml處理
- PHP XML和數組互相轉換
- php解析xml字符串
- php 生成vcf通訊錄
- 文件操作相關
- php獲取文件后綴的9種方法
- PHP判斷遠程文件是否存在
- PHP獲取文件修改時間,訪問時間,inode修改時間
- php獲取遠程文件大小教程
- php 讀取文件并以文件方式下載
- php 把數字轉化為大寫中文
- 請求響應
- PHP 獲取當前訪問的URL
- 壓縮
- php生成zip壓縮包
- PHPMailer
- 整理PHPMailer 發送郵件 郵件內容為html 可以添加多個附件等
- 通達oa
- OA管理員密碼忘了怎么辦,這里教你分分鐘搞定…
- 跨域
- php解決多站點跨域
- php設置samesite cookie,有效防止CSRF
- Chrome 配置samesite=none方式
- Cookie 的 SameSite 屬性
- 圖片
- php pdf首頁截圖,PHP_PHP中使用Imagick讀取pdf并生成png縮略圖實例,pdf生成png首頁縮略圖
- PHP -- 七牛云 在線視頻 獲取某一幀作為封面圖
- PHP圖片壓縮方法
- 如何解決PHP curl或file_get_contents下載圖片損壞或無法打開的問題
- php遠程下載文章中圖片并保存源文件名不變
- 詳解PHP如何下載采集圖片到本地(附代碼實例)
- php如何將webp格式圖片轉為jpeg
- PHP獲取遠程圖片的寬高和體積大小
- php 軟件版本號比較
- 使用PHP通過SMTP發送電郵
- 常用正則表達式
- php如何用正則表達式匹配中文
- 用于分割字符串的 PHP preg_match_all 正則表達式
- 性能優化
- php.ini配置調優
- PHP 幾種常見超時的設置方法
- PHP函數in_array、array_key_exists和isset效率分析
- php array push 和array_merge 效率誰高,php 通過array_merge()和array+array合并數組的區別和效率比較...
- php 兩個數組取交集、并集、差集
- 設置PHP最大連接數及php-fpm 高并發 參數調整
- 小工具
- php 獲取代碼執行時間和消耗的內存
- PHP如何判斷某項擴展是否開啟
- centos7.x下php 導出擴展 XLSXWriter 安裝
- php生成mysql數據庫字典
- PHP 實現 word/excel/ppt 轉換為 PDF
- composer的使用
- showdoc sqlite3 找回管理員密碼
- php怎么將數組轉為xml
- PHP抖音最新視頻提取代碼
- yii
- Yii2 如何獲取Header參數?
- swoole
- Linux下搭建swoole服務的基本步驟
- 相關學習資料
- 帶你學習swoole_process詳解
- 按照官方文檔 在win10下安裝 docker for windows easyswoole鏡像 掛載目錄
- php常用框架
- Hyperf
- 常用算法PHP版
- thinkphp6
- TP6 事件綁定、監聽、訂閱
- Thinkphp 模板中輸出HTML的變量
- Thinkphp6(操作SQL數據庫)
- thinkphp6 mysql查詢語句對于為null和為空字符串給出特定值處理
- Thinkphp 6 - 連接配置多個數據庫并實現自由切換(詳細過程及實例demo)
- TP框架中的Db::name 和 dB::table 以及 db('') 的區別
- thinkphp6.0模型篇之模型的軟刪除
- thinkphp6自定義日志驅動,增加顯示全部請求信息
- 其他系統
- 微擎數據庫字段字典
- Flutter實現微信支付和iOS IAP支付
- Flutter上線項目實戰——蘋果內購
- PHP接入蘋果支付
- 調試
- php如何獲取當前腳本所有加載的文件
- php跟蹤所有調用方法,日志方法
- 解析phpstorm + xdebug 遠程斷點調試
- PHP XDEBUG調試 PHPSTORM配置
- 異常處理
- PHP 出現 502 解決方案
- php 語法解析錯誤 syntax error unexpected namespace T_NAMESPACE
- Composer 安裝與使用
- 數據庫相關
- php pdo怎么設置utf8
- php 如何根據最新聊天對用戶進行排序
- php lic&fpm
- 讓php程序在linux后臺執行
- PHPcli模式和fpm模式優缺點在哪里?
- 運行模式
- php運行模式之cli模式
- 自己庫
- php批量獲取所有公眾號粉絲openid
- 地圖
- php 判斷點在多邊形內,php百度地圖api判斷地址是否在多邊形區域內
- PHP,Mysql-根據一個給定經緯度的點,進行附近地點查詢
- MySQL 根據經緯度查找排序
- PHP+MySQL獲取坐標范圍內的數據
- 【百度地圖】刪除指定覆蓋物
- 百度地圖多點+畫連接線+數字標注
- laravel5.8
- laravel5.8(四)引入自定義常量文件及公共函數文件
- Lumen 查詢執行SQL
- 使你的 Laravel 項目模塊化
- Laravel 多條件 AND , OR條件組合查詢
- Laravel 查詢 多個or或者and條件
- laravel redis操作大全
- laravel中外部定義whereIn的用法和where中使用in
- lumen5.8
- 創建laravel5.8 lumen前后臺api項目--記錄請求和響應日志
- Laravel和Lumen開啟SQL日志記錄
- Laravel 5.8 常用操作(路徑+日志+分頁+其他操作)
- 升級php7.4 laravel lumen報錯Trying to access array offset on value of type null
- Laravel 任務調度(計劃任務,定時任務)
- laravel的command定時任務時間的設置
- Laravel任務調度的簡單使用
- laravel單數據庫執行事務和多數據庫執行事務
- laravel中鎖以及事務的簡單使用
- 申請其他相關
- 小程序地理位置接口申請
- PHP高并發
- php 高并發下 秒殺處理思路
- 記錄 PHP高并發 商品秒殺 問題的 Redis解決方案
- thinkphp3.2
- thinkphp3.2 數據庫 AND OR連綴使用
- laravel
- laravel的聯表查詢with方法的使用
- laravel獲取請求路由對應的控制器和方法
- Laravel 模型關聯建立與查詢
- Laravel多表(3張表以上)with[]關聯查詢,對關聯的模型做條件查詢(has,跟join一樣結果 )
- Laravel模型屬性的隱藏屬性、顯示屬性和臨時暴露隱藏屬性用法介紹
- aravel獲取當前的url以及當前的基礎域名方法匯總
- Laravel 模型實現多庫查詢或者多表映射
- 關于 Laravel 的 with 多表查詢問題
- Laravel 模型過濾(Filter)設計
- 懶加載、預加載、with()、load() 傻傻分不清楚?
- laravel模型$castsl屬性
- Laravel Query Builder 復雜查詢案例:子查詢實現分區查詢 partition by
- Laravel 模型關聯、關聯查詢、預加載使用實例
- laravel 中with關聯查詢限定查詢字段
- laravel 原生字段查詢 whereRaw 和 where(DB::raw(''))
- lavarel - where條件分組查詢(orWhere)
- 通過 Laravel 查詢構建器實現復雜的查詢語句
- 兩個結果集合并成一個
- Laravel 對某一列進行篩選然后求和 sum()
- laravel怎么優雅的拼接where,處理whereIn與where數組查詢的問題
- laravel查詢時判斷是否存在數據
- laravel中的whereNull和whereNotNull
- laravel框架中的子查詢
- Laravel框架中 orwhere 多條件查詢的使用
- Laravel中where的高級使用方法
- laravel復雜的數據庫查詢(事例)
- laravel多條件查詢方法(and,or嵌套查詢)
- Laravel 的 where or 查詢
- Laravel 進行where 多個or和and的條件查詢可用
- laravel Middleware 中間件 $next($request) 報錯不執行問題
- 基于Laravel框架--自定義CORS跨域中間件
- laravel9新增路由文件及解決跨域問題方法
- 解決在laravel中leftjoin帶條件查詢沒有返回右表為NULL的問題
- 【Laravel 】faker數據填充詳解
- 數據庫
- mysql
- mysql聯合索引(復合索引)詳解
- MYSQL 清空表和截斷表
- MySQL快速生成大量測試數據(100萬、1000萬、1億)
- 提高mysql千萬級大數據SQL查詢優化30條經驗(Mysql索引優化注意)
- MySQL常用命令
- MySQL(三)|《千萬級大數據查詢優化》第一篇:創建高性能的索引
- MySQL(一)|性能分析方法、SQL性能優化和MySQL內部配置優化
- MySQL(二)|深入理解MySQL的四種隔離級別及加鎖實現原理
- MySQL(四)|《千萬級大數據查詢優化》第一篇:創建高性能的索引(補充)
- MySQL(五)|《千萬級大數據查詢優化》第二篇:查詢性能優化(1)
- MySQL(六)|《千萬級大數據查詢優化》第二篇:查詢性能優化(2)
- MySQL(七)|MySQL分庫分表的那點事
- Mysql索引優化 Mysql通過索引提升查詢效率(第二棒)
- MySQL查詢的性能優化(查詢緩存、排序跟索引)
- 【總結】MySQL數據庫
- MySQL存儲引擎、事務日志并發訪問以及隔離級別
- 技巧
- 數據庫 SQL查詢重復記錄 方法
- 替換數據庫中某個字段中的部分字符
- mysql開啟bin log 并查看bin log日志(linux)
- 分表分區
- 千萬級別數據的mysql數據表優化
- MYSQL百萬級數據,如何優化
- MySQL備份和恢復
- MySQL間隙鎖死鎖問題
- 小技巧
- 基礎
- MySQL中sql_mode參數
- mysql數據庫異常
- this is incompatible with sql_mode=only_full_group_by
- mysql安全
- MySQL數據庫被比特幣勒索及安全調整
- mysql忘記密碼后重置(以windows系統mysql 8.4為例)
- MongoDB
- sql查詢
- MYSQL按時間段分組查詢當天,每小時,15分鐘數據分組
- 高級
- 基于 MySQL + Tablestore 分層存儲架構的大規模訂單系統實踐-架構篇
- 數據庫安全
- 服務器被黑,MySQL 數據庫遭比特幣勒索!該如何恢復?
- 數千臺MySQL數據庫遭黑客比特幣勒索,該怎么破?
- MySQL 數據庫規范
- MySQL數據庫開發的36條鐵律
- Elasticsearch
- 安裝與配置
- ElasticSearch關閉重啟命令
- 設置ES默認分詞器IK analyzer
- 查詢
- elasticsearch 模糊查詢不分詞,實現 mysql like
- elasticSearch多條件高級檢索語句,包含多個must、must_not、should嵌套示例,并考慮nested對象的特殊檢索
- elasticSearch按字段普通檢索,結果高亮
- Elasticsearch 如何實現查詢/聚合不區分大小寫?
- 索引更新&刷新
- refresh與批量操作的效率
- Elasticsearch 刪除type
- 分詞器
- ElasticSearch最全分詞器比較及使用方法
- 異常錯誤
- 解決ES因內存不足而無法查詢的錯誤,Data too large, data for [<http_request>]
- linux
- 基本知識
- CentOS7.5 通過wget下載文件到指定目錄
- 【CentOS】vi命令
- centos7查看硬盤使用情況
- CentOS7 查看目錄大小
- Centos 7下查看當前目錄大小及文件個數
- 普通用戶sudo\su 到root免密碼
- 普通用戶切換到root用戶下的免密配置方法
- linux 獲取進程啟動參數,linux查看進程啟動及運行時間
- Linux 查看進程
- linux刪除文件后不釋放磁盤的問題
- Linux查找大文件命令
- linux 如何關閉正在執行的php腳本
- linux三劍客(grep、sed、awk)基本使用
- centos 卸載軟件
- centos查看內存、cpu占用、占用前10,前X
- Centos 查看系統狀態
- 異常
- 問題解決:Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist:...
- php相關
- centos 安裝phpize
- Centos7.2下phpize安裝php擴展
- 切換版本
- 運營工具
- 資深Linux運維工程師常用的10款軟件/工具介紹
- 一款良心的終端連接工具
- 六款Linux常用遠程連接工具介紹,看看哪一款最適合你
- Finalshell
- Linux Finalshell連接centos7和文件無顯示問題
- WSL2:我在原生的Win10玩轉Linux系統
- MobaXterm
- 運維
- linux服務器上定時自動備份數據庫,并保留最新5天的數據
- Centos系統開啟及關閉端口
- CentOS7開放和關閉端口命令
- Linux中查看所有正在運行的進程
- 防火墻firewall-cmd命令詳解
- centos 7.8阿里云服務器掛載 數據盤
- Linux Finalshell連接centos7和文件無顯示問題
- Centos7系統端口被占用問題的解決方法
- vi
- 如何在Vim/Vi中復制,剪切和粘貼
- 命令
- [Linux kill進程] kill 進程pid的使用詳解
- 備份還原
- Linux的幾種備份、恢復系統方式
- Linux系統全盤備份方法
- 相關軟件安裝
- linux下 lua安裝
- python
- 升級pip之后出現sys.stderr.write(f“ERROR: {exc}“)
- lua
- centos源碼部署lua-5.3
- deepin
- deepin20.6設置默認的root密碼
- 任務相關
- 寶塔定時任務按秒執行
- CentOS 7 定時任務 crontab 入門
- centos7定時任務crontab
- Linux下定時任務的查看及取消
- Linux(CentOS7)定時執行任務Crond詳細說明
- Linux 查看所有定時任務
- linux查看所有用戶定時任務
- Linux 定時任務(超詳細)
- 防火墻
- Centos7開啟防火墻及特定端口
- CentOS防火墻操作:開啟端口、開啟、關閉、配置
- 生成 SSH 密鑰(windows+liunx)
- 阿里云,掛載云盤
- 前端
- layui
- layui多文件上傳
- layer.msg()彈框,彈框后繼續運行
- radio取值
- layui-數據表格排序
- Layui select選擇框添加搜索選項功能
- 保持原來樣式
- layui表格單元如何自動換行
- layui-laydate時間日歷控件使用方法詳解
- layui定時刷新數據表格
- layer 延時設置
- layer.open 回調函數
- 【Layui內置方法】layer.msg延時關閉msg對話框(代碼案例)
- layui多圖上傳圖片順序錯亂及重復上傳解決
- layer.confirm關閉彈窗
- vue
- Vue跨域解決方法
- vue 4.xx.xx版本降級至2.9.6
- vue-cli 2.x升級到3.x版本, 和3.x降級到2.x版本命令
- 最新版Vue或者指定版本
- Vue2.6.11按需模塊安裝配置
- jQuery
- jQuery在頁面加載時動態修改圖片尺寸的方法
- jquery操作select(取值,設置選中)
- 日歷
- FullCalendar中文文檔:Event日程事件
- js
- JS 之 重定向
- javascript截取video視頻第一幀作為封面方案
- HTML <video> preload 屬性
- jQuery使用ajax提交post數據
- JS截取視頻靚麗的幀作為封面
- H5案例分享:移動端touch事件判斷滑屏手勢的方向
- JS快速獲取圖片寬高的方法
- win
- Windows環境下curl的使用
- Cygwin
- Windows下安裝Cygwin及apt-cyg
- Cygwin 安裝、CMake 安裝
- mklink命令 詳細使用
- Nginx
- Nginx高級篇-性能優化
- Nginx常用命令(Linux)
- linux+docker+nginx如何配置環境并配置域名訪問
- Nginx的啟動(start),停止(stop)命令
- linux 查看nginx 安裝路徑
- 安裝配置
- Linux 查看 nginx 安裝目錄和配置文件路徑
- 【NGINX入門】3.Nginx的緩存服務器proxy_cache配置
- thinkphp6.0 偽靜態失效404(win下)
- 深入
- nginx rewrite及多upstream
- Nginx負載均衡(upstream)
- 專業術語
- 耦合?依賴?耦合和依賴的關系?耦合就是依賴
- PHP常用六大設計模式
- 高可用
- 分布式與集群
- Nginx 實踐案例:反向代理單臺web;反向代理多組web并實現負載均衡
- 容器
- Docker
- 30 分鐘快速入門 Docker 教程
- linux查看正在運行的容器,說說Docker 容器常用命令
- Windows 安裝Docker至D盤
- 配置
- win10 快速搭建 lnmp+swoole 環境 ,部署laravel6 與 swoole框架laravel-s項目1
- win10 快速搭建 lnmp+swoole 環境 ,部署laravel6 與 swoole框架laravel-s項目2
- docker 容器重命名
- Linux docker常用命令
- 使用
- docker 搭建php 開發環境 添加擴展redis、swoole、xdebug
- docker 單機部署redis集群
- Docker 退出容器不停止容器運行 并重新進入正在運行的容器
- 進入退出docker容器
- Docker的容器設置隨Docker的啟動而啟動
- 使用異常處理
- docker容器中bash: vi: command not found
- OCI runtime exec failed: exec failed:解決方法
- docker啟動容器慢,很慢,特別慢的坑
- 解決windows docker開發thinkphp6啟動慢的問題
- 【Windows Docker】docker掛載解決IO速度慢的問題
- Docker的網絡配置,導致Docker使用網路很慢的問題及解決辦法
- golang工程部署到docker容器
- Docker 容器設置自啟動
- 如何優雅地刪除Docker鏡像和容器(超詳細)
- 5 個好用的 Docker 圖形化管理工具
- Docker 可能會用到的命令
- Kubernetes
- 消息隊列
- RabbitMQ
- php7.3安裝使用rabbitMq
- Windows環境PHP如何使用RabbitMQ
- RabbitMQ學習筆記:4369、5672、15672、25672默認端口號修改
- Window10 系統 RabbitMQ的安裝和簡單使用
- RabbitMQ默認端口
- RabbitMQ可視化界面登錄不了解決方案
- RocketMQ
- Kafka
- ActiveMQ
- mqtt
- phpMQTT詳解以及處理使用過程中內存耗死問題
- MQTT--物聯網(IoT)消息推送協議
- php實現mqtt發布/發送 消息到主題
- Mqtt.js 的WSS鏈接
- emqx
- 如何在 PHP 項目中使用 MQTT
- emqx 修改dashboard 密碼
- 其他
- Windows 系統中單機最大TCP的連接數詳解
- EMQX
- Linux系統EMQX設置開機自啟
- Centos7 EMQX部署
- docker安裝 EMQX 免費版 docker安裝并配置持久化到服務器
- 實時數倉
- 網易云音樂基于 Flink + Kafka 的實時數倉建設實踐
- 實時數倉-基于Flink1.11的SQL構建實時數倉探索實踐
- 安全
- 網站如何保護用戶的密碼
- 關于web項目sessionID欺騙的問題
- php的sessionid可以偽造,不要用來做防刷新處理了
- DVWA-Weak Session IDs (弱會話)漏洞利用方式
- 保證接口數據安全的10種方案
- cookie和session的竊取
- 萬能密碼漏洞
- 黑客如何快速查找網站后臺地址方法整理
- 網站后臺萬能密碼/10大常用弱口令
- 萬能密碼漏洞02
- 大多數網站后臺管理的幾個常見的安全問題注意防范
- token可以被竊取嗎_盜取token
- token被劫持[token被劫持如何保證接口安全性]
- PHP給后臺管理系統加安全防護機制的一些方案
- php - 重新生成 session ID
- 隱藏響應中的server和X-Powered-By
- PHP會話控制之如何正確設置session_name
- Session攻擊001
- PHP防SQL注入代碼,PHP 預防CSRF、XSS、SQL注入攻擊
- php25個安全實踐
- php架構師 系統管理員必須知道的PHP安全實踐
- 版本控制
- Linux服務器關聯Git,通過執行更新腳本實現代碼同步
- PHP通過exec執行git pull
- git 在linux部署并從windows上提交代碼到linux
- git上傳到linux服務器,git一鍵部署代碼到遠程服務器(linux)
- linux更新git命令,使用Linux定時腳本更新服務器的git代碼
- git異常
- 如何解決remote: The project you were looking for could not be found
- git status顯示大量文件修改的原因是什么
- PHPstorm批量修改文件換行符CRLF為LF
- git使用
- git常用命令大全
- centos git保存賬戶密碼
- GIT 常用命令
- git怎樣還原修改
- Git 如何放棄所有本地修改的方法
- Git忽略文件模式改變
- git: 放棄所有本地修改
- Git三種方法從遠程倉庫拉取指定的某一個分支
- 雜七雜八
- h5視頻
- H5瀏覽器支持播放格式:H264 AVCA的MP4格式,不能轉換為mpeg-4格式,
- iOS無法播放MP4視頻文件的解決方案 mp4視頻iphone播放不了怎么辦
- h5點播播放mp4視頻遇到的坑,ios的h5不能播放視頻等
- 【Linux 并發請求數】支持多少并發請求數
- Linux下Apache服務器并發優化
- 緩存
- redis
- Linux啟動PHP的多進程任務與守護redis隊列
- 重啟redis命令
- golang