elasticsearch的keyword与text的区别

es2.*用户可忽略该文章。es 2.*版本里面是没有这两个字段!!!

当初接触es,最惊讶就是他的版本速度发布太快,这次主要讨论keyword与text的区别

在es 2.*版本里面是没有这两个字段,只有string字段。

5.*之后,把string字段设置为了过时字段,引入text,keyword字段

这两个字段都可以存储字符串使用,但建立索引和搜索的时候是不太一样的

keyword:存储数据时候,不会分词建立索引

text:存储数据时候,会自动分词,并生成索引(这是很智能的,但在有些字段里面是没用的,所以对于有些字段使用text则浪费了空间)。

"zuMaker":
    {"type":"keyword","index":"false"},
"zuName":
    {"type":"text","index":"true","boost":"5","analyzer":"ik_max_word","search_analyzer":"ik_max_word"},

现在我建立两个字段:

zuMaker 族制作人 keyword类型

zuName  族名称 text类型

我现在分别往两个字段里面存储数据,zuMaker存储 "张三李四"zuName存储 “墙体钢结构”、

其实在存储的过程中zuMaker 没有分词,只是存储了一个张三李四,而zuName字段存储倒排索引的时候进行了分词 墙体 和 钢结构或者是墙体 钢 结构。

这样在查询的时候,这两个字段的区别就表现出来了

如果精确查找zuName字段

   { "query": { "term": { "zuName": "墙体钢结构" } } }

会出现空数据,表示查不到数据,这是因为墙体钢结构这个值在存储的时候被分词了,倒排索引里面只有‘墙体’,‘钢结构‘,这两个词所以会出现查找为空的记录

这种情况下的分词是存储数据时候的分词,还有一种分词是在你搜索的时候根据你的搜索参数进行分词后再进行搜索的。es提供了许多开箱即用的分析器analyzer,大家也可以去下载被人开发好的分词器然后安装在es的plugins下,然后在声明使用。在zuName这个字段我用的是ik的分词器,是一个大家基本都会用到的中文分词器,git地址为 https://github.com/medcl/elasticsearch-analysis-ik。

如果精确查找zuMakert字段

    { "query": { "term": { "zuMakert": "张三李四" } } }

这时候这条记录是存在的,因为keyword字段不会进行分词。

这查询是精确查询出现的结果,如果你使用分词查询,结果就会一样,但搜索结构的权重是不一样的。具体区别大家自己上级实验。

原文地址:https://www.cnblogs.com/fengda/p/10348607.html

时间: 2024-10-10 23:22:01

elasticsearch的keyword与text的区别的相关文章

$().thml()与$().text()的区别

<1> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <script src="http://localhost:41928/Jquery/jquery-1.10.2.js" type="text/javascript"></script> <script type=&q

Jenkins中 readFile 与 File.text 的区别

Jenkins中 获取文件内容的方法有两种 一个是 调用readFile(), 另一个是 new 一个File 对象,再调用 File 对象的text或者getText()方法 具体的请参考下面的link: 1.readFile() https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#readfile-read-file-from-workspace 2.File.text/File.getText() http://docs.

python request中的content和text的区别

一直不清楚requestes的content和text方法的区别,只知道content返回的是二进制数据,而text返回的是文本数据 先看看content的源码: 注释可知content返回的是bytes型也就是二进制的数据 在看看text的源码: 意思是requests.text是根据网页的响应来猜测编码,如果服务器不指定的话,默认编码是"ISO-8859-1"所以这是为什么有些时候用 response.text 返回的是乱码的原因. 可以用response.encoding看一下他

html,text,val区别

1 首先,html属性中有两个方法,一个有参,一个无参 2 3 1. 无参html():取得第一个匹配元素的html内容.这个函数不能用于XML文档.但可以用于XHTML文档,返回的是一个String 4 5 例子: 6 7 html页面代码:<div><p>Hello</p></div> 8 9 jquery代码:$("div").html(); 10 11 结果:Hello 12 13 2.有参html(val):设置每一个匹配元素的

JQuery中的html(),text(),val()区别

1.HTML html():取得第一个匹配元素的html内容.这个函数不能用于XML文档.但可以用于XHTML文档 html(val):设置每一个匹配元素的html内容.这个函数不能用于XML文档.但可以用于XHTML文档. 2.TEXT text():取得所有匹配元素的内容. 结果是由所有匹配元素包含的文本内容组合起来的文本.这个方法对HTML和XML文档都有效. text(val):设置所有匹配元素的文本内容 与 html() 类似, 但将编码 HTML (将 "<" 和 &

&quot;text&quot;和new String(&quot;text&quot;)的区别

转自:What is the difference between "text" and new String("text")? new String("text"); explicitly creates a new and referentially distinct instance of a Stringobject; String s = "text"; may reuse an instance from the 

***浅析JQuery中的html(),text(),val()区别

jQuery中. html()用为读取和修改元素的HTML标签, text()用来读取或修改元素的纯文本内容, val()用来读取或修改表单元素的value值. 1.HTML html():取得第一个匹配元素的html内容.这个函数不能用于XML文档.但可以用于XHTML文档 html(val):设置每一个匹配元素的html内容.这个函数不能用于XML文档.但可以用于XHTML文档. 2.TEXT text():取得所有匹配元素的内容. 结果是由所有匹配元素包含的文本内容组合起来的文本.这个方法

Mysql 中 char 、varchar 、text的区别

首先它们的存储方式和数据的检索方式都不一样.数据的检索效率是:char > varchar > text 空间占用方面,就要具体情况具体分析了. char:存储定长数据很方便,CHAR字段上的索引效率级高,必须在括号里定义长度,可以有默认值,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间(自动用空格填充),且在检索的时候后面的空格会隐藏掉,所以检索出来的数据需要记得用什么trim之类的函数去过滤空格. varchar:存储变长数据,但存储效率没有C

html和text的区别

1.html <div id="divShow"><b><i>Write Less Do More</i></b></div> var str1 = $("#divShow").html(); document.write(str1); 结果是:<b><i>Write Less Do More</i></b> 2.text <div id=&