多字段特性及Mapping中配置自定義Analyzer
PUT logs/_doc/1
{“level”:“DEBUG”}
我們在建立索引的時候,可以建立多字段類型,通過多字段類型可以進行一些精确比對,也可以使用不同的analyzer分詞
GET /logs/_mapping
exact values(keyword) 精确值 full text(text) 全文檢索 exact values 就是不需要進行分詞
character filters 特性過濾(當分詞後設定特定 的過濾方式)
tokenizer 分詞器
position 位置 offset 偏移量
token filters 過濾器(設定一下停用詞,大小寫轉換,近義詞等)
可以通過_analyze對于文本的分詞結果進行測試
指定tokenizer為keyword char_filter 為html_strip 則表示,按照keyword進行分詞,也就是不做什麼處理,将測試的值當成一個詞整體 原樣輸出 并去除标簽
POST _analyze
{
"tokenizer": "keyword",
"char_filter": ["html_strip"],
"text": "<b>hello world</b>"
}
将詞作為檔案路徑進行分詞
POST _analyze
{
“tokenizer”:“path_hierarchy”,
“text”:"/user/raven/a/b/c/d/e"
}
也可以使用char_filter 進行一些特定的替換過濾
使用 standard進行分詞 設定了特定的character filters 将- 替換為了_
POST _analyze
{
"tokenizer" : "standard",
"char_filter" : [
{
"type" : "mapping",
"mappings" : ["- => _"]
}
],
"text": "123-456, I-test! test-990 650-555-1234"
}
white space and snowball 使用空格進行分詞,并且将一些沒有意義的詞進行剔除停用 通過snowball将詞還原為最初的樣子
GET _analyze
{
"tokenizer": "whitespace",
"filter": ["stop","snowball"],
"text": ["The gilrs in China are playing this game!"]
}
GET _analyze
{
"tokenizer": "whitespace",
"filter": ["stop","snowball"],
"text": ["The rain in Spain falls mainly on the plain."]
}
lowercase 将詞轉為小寫,又因為存在stop 是以the會被剔除
GET _analyze
{
"tokenizer": "whitespace",
"filter": ["lowercase","stop","snowball"],
"text": ["The gilrs in China are playing this game!"]
}
正規表達式
GET _analyze
{
"tokenizer": "standard",
"char_filter": [
{
"type": "pattern_replace",
"pattern": "http://(.*)",
"replacement": "$1"
}
],
"text": "http://www.elastic.co"
}
建立一個自定義的分詞器
建立一個自定義的分詞器,通過settings進行設定,取名為my_custom_analyzer 指定他擁有一個特定的分詞過濾方式,指定他有一個特點的分詞器,指定他有特定的過濾器 自定義的分詞器中指定他使用ik分詞器,自定義的特性過濾器中取出了标簽,自定義的過濾器中,過濾了英語中的無效詞
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"type": "custom",
"char_filter":"my_charfilter",
"tokenizer": "my_tokenizer",
"filter": [
"lowercase",
"my_stop"
]
}
},
"tokenizer": {
"my_tokenizer": {
"type": "ik_smart"
}
},
"char_filter": {
"my_charfilter":{
"type": "html_strip"
}
},
"filter": {
"my_stop": {
"type": "stop",
"stopwords": "_english"
}
}
}
}
}
測試自定義的分詞器 他去除了标簽和 英語中的輔助詞。并且按照ik分詞器的細粒度分詞,進行了分詞。
POST my_index/_analyze
{
"analyzer": "my_custom_analyzer",
"text": "我在北京天安門看<a>天空</a> is very happy ,and you?"
}