时间:2022-07-25 10:53:31 | 栏目:PHP代码 | 点击:次
说实话,刚测试ES的时候,我的内心是崩溃的,好多单词都不知道代表什么意思,只能一边测试,一边查询。看到就赶紧记下来,一天下来,也算是学的七七八八吧。这里分享给大家。
curl -XPOST 'localhost:9200/bank/type1/_search?pretty' -d ' { "query": { "match_all": {} } }' (1)9200后面的bank是索引名字 (2)type1代表es的type,类似于传统数据库的table (3)pretty:pretty是将返回的信息以可读的JSON形式返回
这个字段代表是否存储在原始文档。如果设置为true,那么查询之后,会在hits.hits里面有个_source数组,展示原始文档。
_source可以限制存储部分字段,或者不存储部分字段,形如:
"yourtype":{ "_source":{ "includes":["field1","field2"] //这两个字段会存储在原始文档 }, "properties": { ... } } "yourtype":{ "_source":{ "excludes":["field1","field2"] //这两个字段不会存储在原始文档 }, "properties": { ... } }
这个属性的配置方法和_source类似,它是把一个文档里面的所有信息都放到一起组合成一个大字段。我们可以设置这个字段包含所有的字段,也可以设置只包含几个字段,或者是只存储几个字段
"yourtype": { "_all": { "enabled": true //这样设置的话,就包含了所有的字段 },}
(2)包含或者不包含部分字段
"yourtype": { "properties": { "field1": { "type": "string", "include_in_all": false //这个字段不包含在_all }, "field2": { "type": "string", "include_in_all": true //这个字段包含在_all } } }
这个字段类似于咱们百度的时候,符合预期文字的部分都会高亮显示出红色来
"query": { "match": { "_all": "中国人" } }, "highlight": { "fields": { //"_all": {} //这是对_all字段进行高亮查询 //"title": {} //这是对title字段进行高亮显示 } }
这个属性是控制该字段是否生成倒排索引,取值主要有三个:
(1)analyzed:字段被索引,会做分词,可搜索。反过来,如果需要根据某个字段进搜索,index属性就应该设置为analyzed。 (2)not_analyzed:字段值不分词,会被原样写入索引。反过来,如果某些字段需要完全匹配,比如人名、地名,index属性设置为not_analyzed为佳。 (3)no:字段不写入索引,当然也就不能搜索。反过来,有些业务要求某些字段不能被搜索,那么index属性设置为no即可。
类似于:
(1)analyzed:字段被索引,会做分词,可搜索。反过来,如果需要根据某个字段进搜索,index属性就应该设置为analyzed。 (2)not_analyzed:字段值不分词,会被原样写入索引。反过来,如果某些字段需要完全匹配,比如人名、地名,index属性设置为not_analyzed为佳。 (3)no:字段不写入索引,当然也就不能搜索。反过来,有些业务要求某些字段不能被搜索,那么index属性设置为no即可。
用于指定是否将原始字段写入索引,默认取值为no。
因为在Lucene中,高亮功能和store属性是否存储息息相关,因为需要根据偏移位置到原始文档中找到关键字才能加上高亮的片段。在Elasticsearch,因为_source中已经存储了一份原始文档,可以根据_source中的原始文档实现高亮,在索引中再存储原始文档就多余了,所以Elasticsearch默认是把store属性设置为no。
注意: 如果想要对某个字段实现高亮功能,_source和store至少保留一个。
参考:https://blog.csdn.net/mlljava1111/article/details/70598481
描述了查询分片的信息,查询了多少个分片、成功的分片数量、失败的分片数量等猜测这个字段代表该次查询,获取数据经过的分片数量之和
搜索的结果,total是全部的满足的文档数目,hits是返回的实际数目(默认是10)
代表的是查询结果的评分值,分越高,代表权重越大,排名越靠前。具体的参考:
https://blog.csdn.net/paditang/article/details/79098830
有的时候我们可能对分数不感兴趣,就可以使用filter进行过滤,它不会去计算分值,因此效率也就更高一些
我们可以通过制定路由,而避免ES自己进行大量的广播操作。直接按照我们制定的路由找到对应的分片查询,关于路由机制,我们不做赘述,只是了解下就行。
具体请参考:https://blog.csdn.net/cnweike/article/details/38531997
这两个是精准查找,一个是单数,一次查找单个值。一个是复数,一次查找多个值。
例如:"terms" : { "price" : [20, 30] }
GET _search { "query": { "filtered": { "query": { "match": { "text": "quick brown fox" } }, "filter": { "term": { "status": "published" } } } } }
(1) 这里的"filtered": 从ES5.0之后被移除了。
(2) filter代表过滤匹配,也是为了过滤status字段,让它不去计算的分数,不用计算权重等。
新的语句为:
GET _search { "query": { "bool": { "must": { "match": { "text": "quick brown fox" } }, "filter": { "term": { "status": "published" } } } } }
(3) bool代表的是bool查询,参数主要有:
must 所有的语句都 必须(must) 匹配,与 AND 等价。 must_not 所有的语句都 不能(must not) 匹配,与 NOT 等价。 should 至少有一个语句要匹配,与 OR 等价