es7深入搜索

基于词项和基与全⽂的搜索
查询方式,包括:复合查询/全文本查询/term-level查询等
什么场景下用 boolen查询,什么场景下用match查询,又是什么场景下用term查询。
你可以自己对查询去做一些分类。
例如terms查询是用于结构化数据的查询。全文用match查询。而bool属于一种复合查询。可以结合terms查询和match查询。
term查询和全文本查询。
如果你对内容做精确匹配,肯定是用term查询。如果你是对全文本查询,那就使用match 查询。
基与term的模糊查询,匹配查询,建议谨慎使用,有时性能不够好
 
多索引 关联查询。父子关系的查询
 
多字段 Mapping 和 Term查询
 
复合查询 – Constant Score 转为 Filter
es7深入搜索_第1张图片

 

Operator

es7深入搜索_第2张图片 

Minimum_should_match
 
es7深入搜索_第3张图片
 
 
Match Phrase Query  短语匹配(Phrase Matching)
es7深入搜索_第4张图片
 

 

Elasticsearch - 短语匹配(match_phrase)以及slop参数

ES是如何处理日期类型数据的时区的?
作者回复: date类型是包含时区信息的,如果我们没有在json代表日期的字符串中显式指定时区,对es来说没什么问题,
但是如果通过kibana显示es里的数据时,就会出现问题,数据的时间会晚8个小时。因为kibana从es里读取的date类型数据,没有时区信息,
kibana会默认当作0时区来解析,但是kibana在通过浏览器展示的时候,会通过js获取当前客户端机器所在的时区,也就是东八区,
所以kibana会把从es得到的日期数据减去8小时。这里就会导致kibana经常遇到的“数据时间延迟8小时”的问题。
所以最佳实践方案就是:我们在往es提交日期数据的时候,直接提交带有时区信息的日期字符串,如:“2016-07-15T12:58:17.136+0800”。
##索引中定义的日期格式与提交数据的日期格式要一致,否则会报错。

term查询是不分词的,哪怕我们设置了该字段的搜索分词也不分吗?
match是分词的,哪怕我们没有设置搜索分词也会分吗?
作者回复: 如果字段设置了keyword,你用term查询,就会精确匹配。例如说keyword字段,索引时是“Iphone”,
你的term查询必须是Iphone,输入“iphone”就无法匹配。
而如果你的字段是“text”类型。你index时候,如果是“Iphone”,在term查询时,“iphone”可以匹配。但是,
“Iphone”不会。很多刚接触的同学会有点困惑。背后的原因是,
text类型的数据会分词,默认分词器会将输入一个个单词切开,并且转小写了。所以你 term查询时,必须用“iphone”
如果你是match查询,在text字段上查询iphone或者Iphone 应该都能查到。

是text会做分词。keyword不做分词。
term查询是把你输入的“内容”不做任何处理,去和text和keyword中的内容比较。
在text中,product-Id被分成词了,iPhone转小写了


对多值字段进行精确匹配提到要用到genre_count组合bool query实现,老师能给个参考实现吗
PUT my_movies/_doc/1
{
  "title":"movie title action",
  "tags":["action"],
  "tags_count":1
}

PUT my_movies/_doc/2
{
  "title":"movie title love",
  "tags":["action","love"],
  "tags_count":2
}

POST my_movies/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {
          "tags": "action"
        }}
      ], 
      "filter": {
        "term": {
          "tags_count": 1
        }
      }
    }
  }
}

老师,文档上也看到了filter 忽略了算分的步骤,而且可以缓存。
那么 我们目前用不到分值是不是可以把条件都写在filter里呢?
缓存压力会不会过大,会不会类似oversharding的效果?或者说有哪些负面影响?
overshard的意思是,分片数设置过多。能用filter context就尽量不要用query content,应该不存在什么负面影响

term查询是不做分词的,而'XHDK-A-1293-#fJ3’这个数据的字段类型是text ,
在编入index的时候做了分词,所以直接查询是查询不到的。
但keyword类型字段默认是不做分词处理的,所以indexing会将其'XHDK-A-1293-#fJ3’完整数据做倒排索引,
使用第二种查询方式便可以查询。
productID.keyword的数据类型为keyword,keyword的数据类型是不分词的;

 

基于全⽂的查询
基于全⽂本的查找
Match Query / Match Phrase Query / Query String Query
特点
索引和搜索时都会进⾏分词,查询字符串先传递到⼀个合适的分词器,然后⽣成⼀个供查询的词
项列表
查询时候,先 会对输⼊的查询进⾏分词 ,然后每个词项逐个进⾏底层的查询,最终将结果进⾏合
并。并为每个⽂档⽣成⼀个算分。- 例如查 “Matrix reloaded”,会查到包括 Matrix 或者 reload
的所有结果。
 
  • 如果要查询执行过程,可以增加 profile 为 true
  • Match Query Result
es7深入搜索_第5张图片

 

es7深入搜索_第6张图片

你可能感兴趣的:(es7)