Ⅰ elasticsearch 怎麼過濾分詞一個字
分詞一個字
Ⅱ 如何查看elasticsearch搜索時使用的是哪個分詞器
aven進行編譯下載的源碼
3
把編譯後的target/releases下的elasticsearch-analysis-ik-1.2.9.zip文件拷貝到ES_HOME/plugins/analysis-ik目錄下面,然後解壓專
4
把下載的ik插件中的conf/ik目錄拷貝到ES_HOME/config下
5
修改屬ES_HOME/config/elasticsearch.yml文件,
Ⅲ elasticsearch搜索關鍵詞中有減號,如何讓減號也參與分詞
elasticsearch的config文件夾來裡面有兩個配源置文 件:elasticsearch.yml和logging.yml,第一個是es的基本配置文件,第二個是日誌配置文件,es也是使用log4j來記錄日 志的,所以logging.yml里的設置按普通log4j配置文件來設置就行了。下面主要講解下elasticsearch.yml這個文件中可配置的東西。
cluster.name: elasticsearch
配置es的集群名稱,默認是elasticsearch,es會自動發現在同一網段下的es,如果在同一網段下有多個集群,就可以用這個屬性來區分不同的集群。
node.name: "Franz Kafka"
節點名,默認隨機指定一個name列表中名字,該列表在es的jar包中config文件夾里name.txt文件中,其中有很多作者添加的有趣名字。
node.master: true
指定該節點是否有資格被選舉成為node,默認是true,es是默認集群中的第一台機器為master,如果這台機掛了就會重新選舉master。
Ⅳ 如何讀取elasticsearch的分詞索引信息
一、插件准備
網上有介紹說可以直接用plugin -install medcl/elasticsearch-analysis-ik的辦法,但是我執行下來的效果只是將插件的源碼下載下來,elasticsearch只是將其作為一個_site插件看待。
所以只有執行maven並將打包後的jar文件拷貝到上級目錄。(否則在定義mapping的analyzer的時候會提示找不到類的錯誤)。
由於IK是基於字典的分詞,所以還要下載IK的字典文件,在medcl的elasticsearch-RTF中有,可以通過這個地址下載:
http://github.com/downloads/medcl/elasticsearch-analysis-ik/ik.zip
下載之後解壓縮到config目錄下。到這里,你可能需要重新啟動下elasticsearch,好讓下一部定義的分詞器能立即生效。
二、分詞定義
分詞插件准備好之後就可以在elasticsearch里定義(聲明)這個分詞類型了(自帶的幾個類型,比如standred則不需要特別定義)。跟其他設置一樣,分詞的定義也可以在系統級(elasticsearch全局范圍),也可以在索引級(只在當前index內部可見)。系統級的定義當然是指在conf目錄下的
elasticsearch.yml文件里定義,內容大致如下:
index:
analysis:
analyzer:
ikAnalyzer:
alias: [ik]
type: org.elasticsearch.index.analysis.IkAnalyzerProvider
或者 index.analysis.analyzer.ik.type : "ik"
因為個人喜好,我並沒有這么做, 而是定義在了需要使用中文分詞的index中,這樣定義更靈活,也不會影響其他index。
在定義analyze之前,先關閉index。其實並不需要關閉也可以生效,但是為了數據一致性考慮,還是先執行關閉。(如果是線上的系統需要三思)
curl -XPOST http://localhost:9400/application/_close
(很顯然,這里的application是我的一個index)
然後執行:
curl -XPUT localhost:9400/application/_settings -d '
{
"analysis": {
"analyzer":{
"ikAnalyzer":{
"type":"org.elasticsearch.index.analysis.IkAnalyzerProvider",
"alias":"ik"
}
}
}
}
'
打開index:
curl -XPOST http://localhost:9400/application/_open
到此為止一個新的類型的分詞器就定義好了,接下來就是要如何使用了
或者按如下配置
curl -XPUT localhost:9200/indexname -d '{
"settings" : {
"analysis" : {
"analyzer" : {
"ik" : {
"tokenizer" : "ik"
}
}
}
},
"mappings" : {
"article" : {
"dynamic" : true,
"properties" : {
"title" : {
"type" : "string",
"analyzer" : "ik"
}
}
}
}
}'
如果我們想返回最細粒度的分詞結果,需要在elasticsearch.yml中配置如下:
index:
analysis:
analyzer:
ik:
alias: [ik_analyzer]
type: org.elasticsearch.index.analysis.IkAnalyzerProvider
ik_smart:
type: ik
use_smart: true
ik_max_word:
type: ik
use_smart: false
三、使用分詞器
在將分詞器使用到實際數據之前,可以先測驗下分詞效果:
http://localhost:9400/application/_analyze?analyzer=ik&text=中文分詞
分詞結果是:
{
"tokens" : [ {
"token" : "中文",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 1
}, {
"token" : "分詞",
"start_offset" : 2,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 2
} ]
}
與使用standard分詞器的效果更合理了:
{
"tokens" : [ {
"token" : "中",
"start_offset" : 0,
"end_offset" : 1,
"type" : "<IDEOGRAPHIC>",
"position" : 1
}, {
"token" : "文",
"start_offset" : 1,
"end_offset" : 2,
"type" : "<IDEOGRAPHIC>",
"position" : 2
}, {
"token" : "分",
"start_offset" : 2,
"end_offset" : 3,
"type" : "<IDEOGRAPHIC>",
"position" : 3
}, {
"token" : "詞",
"start_offset" : 3,
"end_offset" : 4,
"type" : "<IDEOGRAPHIC>",
"position" : 4
} ]
}
新的分詞器定義完成,工作正常後就可以在mapping的定義中引用了,比如我定義這樣的type:
curl localhost:9400/application/article/_mapping -d '
{
"article": {
"properties": {
"description": {
"type": "string",
"indexAnalyzer":"ikAnalyzer",
"searchAnalyzer":"ikAnalyzer"
},
"title": {
"type": "string",
"indexAnalyzer":"ik",
"searchAnalyzer":"ik"
}
}
}
}
'
很遺憾,對於已經存在的index來說,要將一個string類型的field從standard的分詞器改成別的分詞器通常都是失敗的:
{
"error": "MergeMappingException[Merge failed with failures {[mapper [description] has different index_analyzer, mapper [description] has
different search_analyzer]}]",
"status": 400
}
而且沒有辦法解決沖突,唯一的辦法是新建一個索引,並制定mapping使用新的分詞器(注意要在數據插入之前,否則會使用elasticsearch默認的分詞器)
curl -XPUT localhost:9400/application/article/_mapping -d '
{
"article" : {
"properties" : {
"description": {
"type": "string",
"indexAnalyzer":"ikAnalyzer",
"searchAnalyzer":"ikAnalyzer"
},
"title": {
"type": "string",
"indexAnalyzer":"ik",
"searchAnalyzer":"ik"
}
}
}
}
至此,一個帶中文分詞的elasticsearch就算搭建完成。 想偷懶的可以下載medcl的elasticsearch-RTF直接使用,裡面需要的插件和配置基本都已經設置好。
------------
標准分詞(standard)配置如下:
curl -XPUT localhost:9200/local -d '{
"settings" : {
"analysis" : {
"analyzer" : {
"stem" : {
"tokenizer" : "standard",
"filter" : ["standard", "lowercase", "stop", "porter_stem"]
}
}
}
},
"mappings" : {
"article" : {
"dynamic" : true,
"properties" : {
"title" : {
"type" : "string",
"analyzer" : "stem"
}
}
}
}
}'
index:local
type:article
default analyzer:stem (filter:小寫、停用詞等)
field:title
測試:
# Sample Analysis
curl -XGET localhost:9200/local/_analyze?analyzer=stem -d '{Fight for your life}'
curl -XGET localhost:9200/local/_analyze?analyzer=stem -d '{Bruno fights Tyson tomorrow}'
# Index Data
curl -XPUT localhost:9200/local/article/1 -d'{"title": "Fight for your life"}'
curl -XPUT localhost:9200/local/article/2 -d'{"title": "Fighting for your life"}'
curl -XPUT localhost:9200/local/article/3 -d'{"title": "My dad fought a dog"}'
curl -XPUT localhost:9200/local/article/4 -d'{"title": "Bruno fights Tyson tomorrow"}'
# search on the title field, which is stemmed on index and search
curl -XGET localhost:9200/local/_search?q=title:fight
# searching on _all will not do anystemming, unless also configured on the mapping to be stemmed...
curl -XGET localhost:9200/local/_search?q=fight
例如:
Fight for your life
分詞如下:
{"tokens":[
{"token":"fight","start_offset":1,"end_offset":6,"type":"<ALPHANUM>","position":1},<br>
{"token":"your","start_offset":11,"end_offset":15,"type":"<ALPHANUM>","position":3},<br>
{"token":"life","start_offset":16,"end_offset":20,"type":"<ALPHANUM>","position":4}
]}
-------------------另一篇--------------------
ElasticSearch安裝ik分詞插件
一、IK簡介
IK Analyzer是一個開源的,基於java語言開發的輕量級的中文分詞工具包。從2006年12月推出1.0版開始, IKAnalyzer已經推出了4個大版本。最初,它是以開源項目Luence為應用主體的,結合詞典分詞和文法分析演算法的中文分片語件。從3.0版本開 始,IK發展為面向Java的公用分片語件,獨立於Lucene項目,同時提供了對Lucene的默認優化實現。在2012版本中,IK實現了簡單的分詞 歧義排除演算法,標志著IK分詞器從單純的詞典分詞向模擬語義分詞衍化。
IK Analyzer 2012特性:
1.採用了特有的「正向迭代最細粒度切分演算法「,支持細粒度和智能分詞兩種切分模式;
2.在系統環境:Core2 i7 3.4G雙核,4G內存,window 7 64位, Sun JDK 1.6_29 64位 普通pc環境測試,IK2012具有160萬字/秒(3000KB/S)的高速處理能力。
3.2012版本的智能分詞模式支持簡單的分詞排歧義處理和數量詞合並輸出。
4.採用了多子處理器分析模式,支持:英文字母、數字、中文詞彙等分詞處理,兼容韓文、日文字元
5.優化的詞典存儲,更小的內存佔用。支持用戶詞典擴展定義。特別的,在2012版本,詞典支持中文,英文,數字混合詞語。
二、安裝IK分詞插件
假設讀者已經安裝好ES,如果沒有的話,請參考ElasticSearch入門 —— 集群搭建。安裝IK分詞需要的資源可以從這里下載,整個安裝過程需要三個步驟:
1、獲取分詞的依賴包
通過git clone https://github.com/medcl/elasticsearch-analysis-ik,下載分詞器源碼,然後進入下載目錄,執行命令:mvn clean package,打包生成elasticsearch-analysis-ik-1.2.5.jar。將這個jar拷貝到ES_HOME/plugins/analysis-ik目錄下面,如果沒有該目錄,則先創建該目錄。
2、ik目錄拷貝
將下載目錄中的ik目錄拷貝到ES_HOME/config目錄下面。
3、分詞器配置
打開ES_HOME/config/elasticsearch.yml文件,在文件最後加入如下內容:
index:
analysis:
analyzer:
ik:
alias: [ik_analyzer]
type: org.elasticsearch.index.analysis.IkAnalyzerProvider
ik_max_word:
type: ik
use_smart: false
ik_smart:
type: ik
use_smart: true
或
index.analysis.analyzer.default.type: ik
ok!插件安裝已經完成,請重新啟動ES,接下來測試ik分詞效果啦!
三、ik分詞測試
1、創建一個索引,名為index。
curl -XPUT http://localhost:9200/index
2、為索引index創建mapping。
curl -XPOST http://localhost:9200/index/fulltext/_mapping -d'
{
"fulltext": {
"_all": {
"analyzer": "ik"
},
"properties": {
"content": {
"type" : "string",
"boost" : 8.0,
"term_vector" : "with_positions_offsets",
"analyzer" : "ik",
"include_in_all" : true
}
}
}
}'
3、測試
curl 'http://localhost:9200/index/_analyze?analyzer=ik&pretty=true' -d '
{
"text":"世界如此之大"
}'
顯示結果如下:
{
"tokens" : [ {
"token" : "text",
"start_offset" : 4,
"end_offset" : 8,
"type" : "ENGLISH",
"position" : 1
}, {
"token" : "世界",
"start_offset" : 11,
"end_offset" : 13,
"type" : "CN_WORD",
"position" : 2
}, {
"token" : "如此",
"start_offset" : 13,
"end_offset" : 15,
"type" : "CN_WORD",
"position" : 3
}, {
"token" : "之大",
"start_offset" : 15,
"end_offset" : 17,
"type" : "CN_WORD",
"position" : 4
} ]
}
Ⅳ 最近在學習elasticsearch,想請問中文分詞器有比IK更好用的嗎像阿里這些大廠都是用什麼分詞。
HanLP也可以
Ⅵ elasticsearch中輸入帶空格的關鍵字,實現模糊查詢
"source.strain": {
"type": "muti_field",
"fields": {
"name": {
"type": "string",
"index": "analyzed"
},
"untouched": {
"type": "string",
"index": "not_analyzed"
}
}
}
利用"muti_field"類型可以對同一個欄位實現模糊查詢和精確查詢。
source.strain.name欄位可以用來進行模糊查詢。
source.strain.untouched欄位可以用來進行精確查詢,由於沒有對欄位進行解析,所以還可以對欄位進行分類統計的工作,即elasticsearch中的facet功能。
Ⅶ 如何在Elasticsearch中安裝中文分詞器和拼音分詞器
Elasticsearch是一個全文搜索引擎。安裝Elasticsearch時需要先安裝Java。要求的jdk版本1.7以上的。以下是內官方文檔:容.Specificallyasofthiswriting,
Ⅷ elasticsearch 測試分詞能分出來,評分卻沒有
Elasticsearch自帶的數據類型是Lucene索引的依據,也是我們做手動映射調整的依據。
映射中主要就是針對欄位設置類型以及類型相關參數。
1.JSON基礎類型如下:
字元串:string
數字:byte、short、integer、long、float、double、
時間:date
布爾值: true、false
數組: array
對象: object
2.Elasticsearch獨有的類型:
多重: multi
經緯度: geo_point
網路地址: ip
堆疊/嵌套對象: nested object
二進制: binary
附件: attachment
注意點:
1.映射應當在建立索引時,同時建立。如果索引建立後,還想做在索引中增加其他類型的映射,是不可以的。elasticsearch 對沒有做映射的類型,都已經指定默認映射。
2.Elasticsearch映射雖然有idnex和type兩層關系,但是實際索引時是以index為基礎的。如果同一個index下不同type的欄位出現mapping不一致的情況,雖然數據依然可以成功寫入並生成各自的mapping,但實際上fielddata中的索引結果卻依然是以index內第一個mapping類型來生成的。
自定義欄位映射
Elasticsearch的Mapping提供了對Elasticsearch中索引欄位名及其數據類型的定義,還可以對某些欄位添加特殊屬性:該欄位是否分詞,是否存儲,使用什麼樣的分詞器等。
精確索引:
欄位都有幾個基本的映射選項,類型(type)和索引方式(index)。以字元串類型為例,index有三個選項:
analyzed:默認選項,以標準的全文索引方式,分析字元串,完成索引。
not_analyzed:精確索引,不對字元串做分析,直接索引欄位數據的精確內容。
no:不索引該欄位。
對於日誌文件來說,很多欄位都是不需要再Elasticsearch里做分析這步的,所以,我們可以這樣設置:
"myfieldname" : {
"type" : "string",
"index" : "not_analyzed"
}
時間格式:
@timestamp這個時間格式在Nginx中叫$time_iso8601,在Rsyslog中叫date-rfc3339,在Elasticsearch中叫dateOptionalTime.但事實上,Elasticsearch完全可以接受其他時間格式作為時間欄位的內容。對於Elasticsearch來說,時間欄位內容實際上就是轉換成long類型作為內部存儲的。所以,接受段的時間格式可以任意設置:
@timestamp: {
"type" : "date",
"index" : "not_analyzed",
"doc_values" : true,
"format" : "dd/MM/YYYY:HH:mm:ss Z"
}
多重索引:
多重索引是Logstash用戶習慣的的一個映射,因為這是Logstash默認開啟的配置:
"title" : {
"type" : "string",
"fields" : {
"raw" : {
"type" : "string",
"index" : "not_analyzed"
}
}
}
其作用時,在title欄位數據寫入的時候,Elasticsearch會自動生成兩個欄位,分別是title和title.raw。這樣,有可能同時需要分詞和不分詞結果的環境,就可以很靈活的使用不同的索引欄位了。比如,查看標題中最常用的單詞,應該是使用title欄位,查看閱讀數最多的文章標題,應該是使用title.raw欄位。
多值欄位:
空欄位:
數組可以是空的。這等於有零個值。事實上,Lucene沒法存放null值,所以一個null值的欄位被認為是空欄位。
下面這四個欄位將被識別為空欄位而不被索引:
"empty_string" : "",
"null_value" : null,
"empty_array" : [],
"array_with_null_value" : [ null ]
Ⅸ 如何在Elasticsearch中安裝中文分詞器
Elasticsearch是一個全文搜索引擎。安裝Elasticsearch時需要先安裝Java。要求的jdk版本1.7以上的回。以下是官方文檔:答.Specificallyasofthiswriting,