日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Elasticsearch——分词器对String的作用

發(fā)布時間:2023/12/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Elasticsearch——分词器对String的作用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

更多內(nèi)容參考:Elasticsearch學(xué)習(xí)總結(jié)

關(guān)于String類型——分詞與不分詞

在Elasticsearch中String是最基本的數(shù)據(jù)類型,如果不是數(shù)字或者標(biāo)準(zhǔn)格式的日期等這種很明顯的類型,其他的一般都會優(yōu)先默認(rèn)存儲成String。同樣的數(shù)據(jù)類型,Elasticsearch也提供了多種存儲與分詞的模式,不同的模式應(yīng)用于不同的場景。

很多人在初次使用Elasticsearch時,都會很納悶...

  • 為什么我存儲的一句話,卻查詢不到?
  • 為什么我輸入了漢語單詞,只能一個字一個字的匹配?
  • 為什么我的url查詢不到?

等等,這些都與是否分詞、使用什么分詞器有關(guān)。

首先說說什么是分詞器吧! 比如我愛你中國!

如果是標(biāo)準(zhǔn)分詞器,會把它拆分成,“我”,“愛”,“你”,“中”,“國”。
如果使用一些漢語的分詞器,則會分析成,“我”,“愛”,“你”,“中國”。

由于倒排索引都是以詞Term為索引的,因此如果分解成了一個一個的詞,查詢“中國”的時候,中國也會被分解成“中”,“國”,這樣就可能誤差到”發(fā)展中國家“這樣的詞。

再說說Elasticsearch中的分詞器吧!

不光是在索引文檔(把數(shù)據(jù)導(dǎo)入到Elasticsearch中),在查詢的時候也需要分詞器。只有索引和查詢的時候使用相同的分詞器,才能查詢出正確的結(jié)果。

但是有時候,我們并不想把一串String給分析,想把它當(dāng)做一個完整的詞。比如

  • www.baidu.com
  • 吉林省 長春市 衛(wèi)星路 6543號

此時,只要設(shè)置字段為不分析,就可以了。這時需要自定義下映射,因為默認(rèn)String就是分析的,而且使用的是標(biāo)準(zhǔn)分詞器。

準(zhǔn)備工作

先建立一個索引

curl -XPUT localhost:9200/abc

然后定義映射,注意:只有剛剛新建、還沒有任何數(shù)據(jù)的索引,才能定義映射。定義映射Mapping可以使用_mapping RESTAPI,符合下面的標(biāo)準(zhǔn)語法:

curl -XPUT localhost:9200/索引名稱/類型名稱/_mapping?pretty -d '{"類型名稱":{"properties":{"字段名稱":{"type":"字段類型","store":"是否存儲","index":"索引方式、是否分析"}}}}'

比如,其中str1為String類型不分析;其他的字段str2為默認(rèn)配置,就不用設(shè)置了。

curl -XPUT localhost:9200/abc/abc/_mapping?pretty -d '{"abc":{"properties":{"str1":{"type":"string","index":"not_analyzed"}}}}'

然后添加兩條數(shù)據(jù):

curl localhost:9200/abc/abc?pretty -d '{"str1":"hello, world!","str2":"goodbye! world"}' {"_index" : "abc","_type" : "abc","_id" : "AVM2vRQgJmh5lL1r79nv","_version" : 1,"created" : true }curl localhost:9200/abc/abc?pretty -d '{"str1":"hello","str2":"world"}' {"_index" : "abc","_type" : "abc","_id" : "AVM2vbbqJmh5lL1r79nw","_version" : 1,"created" : true }

分析的String如何查詢

如果查詢的單個詞,分詞的字段可以使用term進行查詢,如下所示:如果查詢的是一個單獨的詞,那么會返回包含它或者等于它的目標(biāo)文檔。

curl -XPOST localhost:9200/abc/_search?pretty -d '{"query":{"term":{"str2":"world"}}}' {"took" : 1,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"failed" : 0},"hits" : {"total" : 2,"max_score" : 0.5945348,"hits" : [ {"_index" : "abc","_type" : "abc","_id" : "AVM2vbbqJmh5lL1r79nw","_score" : 0.5945348,"_source":{"str1":"hello","str2":"world"}}, {"_index" : "abc","_type" : "abc","_id" : "AVM2vRQgJmh5lL1r79nv","_score" : 0.37158427,"_source":{"str1":"hello, world!","str2":"goodbye! world"}} ]} }

不分析的String如何查詢

如果字段是不分詞的,而查詢的是這個字段里面的一個詞,那么使用term時無法查詢到目標(biāo)文檔的。

$ curl -XPOST localhost:9200/abc/_search?pretty -d '{"query":{"term":{"str1":"hello"}}}' {"took" : 1,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"failed" : 0},"hits" : {"total" : 1,"max_score" : 1.0,"hits" : [ {"_index" : "abc","_type" : "abc","_id" : "AVM2vbbqJmh5lL1r79nw","_score" : 1.0,"_source":{"str1":"hello","str2":"world"}} ]} }

使用term查詢,如果該字段是不分詞,只有完整的輸入目標(biāo)字段,才能正確的匹配。

curl -XPOST localhost:9200/abc/_search?pretty -d '{"query":{"term":{"str1":"hello, world!"}}}' {"took" : 2,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"failed" : 0},"hits" : {"total" : 1,"max_score" : 1.0,"hits" : [ {"_index" : "abc","_type" : "abc","_id" : "AVM2vRQgJmh5lL1r79nv","_score" : 1.0,"_source":{"str1":"hello, world!","str2":"goodbye! world"}} ]} }

總結(jié)

對于分詞的字段:

1 如果查詢的是單個詞,則查詢到包含它的文檔,返回結(jié)果與匹配程度有關(guān)
2 如果查詢的是一段能被分析的話,比如hello world。那么查詢的結(jié)果是包含分析得出的詞的文檔,即包含hello和world的全部文檔。

對于不分詞的字段:

只有查詢的是 目標(biāo)字段的精確值,才能匹配。

總結(jié)

以上是生活随笔為你收集整理的Elasticsearch——分词器对String的作用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。