下载APP
关闭
讲堂
前端训练营
极客商城
客户端下载
兑换中心
企业版
渠道合作
推荐作者

提示信息

字幕
    倍速
      清晰度
        音轨

          当前播放: 24 | 基于词项和基于全文的搜索

          Elasticsearch核心技术与实战

          视频课程 约1000分钟
           写留言

          精选留言(13)

          • fengjiangqwe
            2019-07-13
            老师第二部分的pdf麻烦上传下
            展开

            作者回复: 好的,我让编辑帮我生成后,我github上传。下周一周二吧

            3
          • 无笔秀才
            2019-07-13
            老师,文档上也看到了filter 忽略了算分的步骤,而且可以缓存。那么 我们目前用不到分值是不是可以把条件都写在filter里呢?缓存压力会不会过大,会不会类似oversharding的效果?或者说有哪些负面影响?
            展开

            作者回复: overshard的意思是,分片数设置过多。能用filter context就尽量不要用query content,应该不存在什么负面影响

            1
          • 啊瀚
            2019-07-12
            老师有一个问题,term查询是不分词的,哪怕我们设置了该字段的搜索分词也不分吗?
            match是分词的,哪怕我们没有设置搜索分词也会分吗?
            展开

            作者回复: 如果字段设置了keyword,你用term查询,就会精确匹配。例如说keyword字段,索引时是“Iphone”,你的term查询必须是Iphone,输入“iphone”就无法匹配。

            而如果你的字段是“text”类型。你index时候,如果是“Iphone”,在term查询时,“iphone”可以匹配。但是,“Iphone”不会。很多刚接触的同学会有点困惑。背后的原因是,text类型的数据会分词,默认分词器会将输入一个个单词切开,并且转小写了。所以你 term查询时,必须用“iphone”


            如果你是match查询,在text字段上查询iphone或者Iphone 应该都能查到。

            课上提供的例子你可以运行测试一下。

            1
          • 紫丁香珠
            2019-07-18
            老师,"value": "iPhone" 这个值是es里实际存储的值,为什么查不到呢?//"value":"iphone" 小写的却可以查询到,谢谢~

            POST /products/_search
            {
              "query": {
                "term": {
                  "desc": {
                    "value": "iPhone"
                    //"value":"iphone"
                  }
                }
              }
            }
            展开

            作者回复: 因为desc被分词了(默认分词器还会转小写)。如果要做精确匹配,需要要看keyword类型的字段。

          • zj
            2019-07-18
            precision和recall是干啥的,我好像看视频上没讲,不会是我漏看了吧
            展开

            作者回复: 相关度算分里有?
            precision指的是查准率
            recall 指的是查全率

          • 石将从
            2019-07-15
            为啥kibana执行这个就报错,老师的没有报错

            POST /products/_bulk
            { "index": { "_id": 1 }}
            { "productID" : "XHDK-A-1293-#fJ3","desc":"iPhone" }
            { "index": { "_id": 2 }}
            { "productID" : "KDKE-B-9947-#kL5","desc":"iPad" }
            { "index": { "_id": 3 }}
            { "productID" : "JODL-X-1937-#pV7","desc":"MBP" }

            {
              "error": {
                "root_cause": [
                  {
                    "type": "action_request_validation_exception",
                    "reason": "Validation Failed: 1: type is missing;2: type is missing;3: type is missing;"
                  }
                ],
                "type": "action_request_validation_exception",
                "reason": "Validation Failed: 1: type is missing;2: type is missing;3: type is missing;"
              },
              "status": 400
            }
            展开

            作者回复: 你尝试着把#替换成//看看?

            按照同学的建议,我把//注释变成了# ,不知道这里是否正确。 我一会试一下,有必要我会update一下文件的

            2
          • cricket1981
            2019-07-14
            最后一个课堂问题:对多值字段进行精确匹配提到要用到genre_count组合bool query实现,老师能给个参考实现吗?
            展开

            作者回复: 看一下这个,建模时,加入了tags_count的字段,然后通过bool 查询中,加入一个filter,过滤tags个数

            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
                    }
                  }
                }
              }
            }

          • cricket1981
            2019-07-14
            没有"not_exist"用于查询不存在的元素吗?一定要用下面这种查询吗?感觉有点啰嗦
            "bool": {
                      "must_not": {
                        "exists": {
                          "field": "date"
                        }
                      }
            展开

            作者回复: 应该就这能这样写吧

            1
          • cricket1981
            2019-07-14
            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”。


            ##索引中定义的日期格式与提交数据的日期格式要一致,否则会报错。

            1
          • cricket1981
            2019-07-14
            关于搜索和查询这块老师能给个知识脑图吗?这几节上得有点蒙,什么场景下该用什么样的查询,希望能彻底弄清。
            展开

            作者回复: 脑图请到课程首页上查看,有学习路径和脑图。

            简单来说,term查询和全文本查询。

            如果你对内容做精确匹配,肯定是用term查询。如果你是对全文本查询,那就使用match 查询。

            基与term的模糊查询,匹配查询,建议谨慎使用,有时性能不够好

          • 小鱼
            2019-07-14
            GET products/_mapping 查看索引的信息,没有看到分词器相关信息,是不是默认在text类型上应用standard的分词器?其他的数据类型boolean,date,long不会分词?

            {
              "products" : {
                "mappings" : {
                  "_doc" : {
                    "properties" : {
                      "avaliable" : {
                        "type" : "boolean"
                      },
                      "date" : {
                        "type" : "date"
                      },
                      "price" : {
                        "type" : "long"
                      },
                      "productID" : {
                        "type" : "text",
                        "fields" : {
                          "keyword" : {
                            "type" : "keyword",
                            "ignore_above" : 256
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
            展开

            作者回复: 理解正确。如果你在mapping中指定了其他的分词器,例如“english”,get时就能看到了

          • 小鱼
            2019-07-14
            老师,term不是不分词吗?比如第一个例子中的的"iPhone",为什么第二个例子中的"XHDK-A-1293-#fJ3" 按照"-"分词了?
            展开

            作者回复: 是text会做分词。keyword不做分词。

            term查询是把你输入的“内容”不做任何处理,去和text和keyword中的内容比较。

            在text中,product-Id被分成词了,iPhone转小写了

            1
          • Wenthkim
            2019-07-14
            老师,请问用什么命令可以查看我们已经插入的文档使用什么分词器,还有就是分词后的结果是怎样的?
            展开

            作者回复: 查看索引的mapping,get index_name/mappings

            可查看字段使用的分词器

            1