• es
    Elasticsearch,  技术,  服务组件

    elasticsearch 精确匹配搜索(高准确度)

    elasticsearch可以说是目前应用非常广泛的搜索引擎了,然而如果想要能够完全的满足检索的需求,还是有些需要注意的点的。 ik分词器,是elasticsearch检索中文时最常用的分词器。其有两种分词模式: ik_max_word 会将文本做最细粒度的拆分,比如: 中华人民共和国人民大会堂 => 中华人民共和国、中华人民、中华、华人、人民共和国、人民、共和国、大会堂、大会、会堂 ik_smart 会做最粗粒度的拆分,比如: 中华人民共和国人民大会堂 => 中华人民共和国、人民大会堂 常规的最常用的使用方式就是,数据插入存储时用 ik_max_word模式分词,而检索时,用ik_smart模式分词,即:索引时最大化的将文章内容分词,搜索时更精确的搜索到想要的结果。 模糊匹配 mapping: query: 该检索能够满足大部分的检索需求,也是最常用的检索方式 模糊匹配&精确匹配 有时候,检索不仅需要支持模糊匹配,还需要支持完全匹配 mapping: 通过给字段增加fileds “keyword”, 类型为keyword, 则该fields就可以通过 content.keyword 访问 query: 通过以上方式则可以实现精准匹配 解决因分词问题导致用一些词检索不到数据的情况 上文我们讲过,索引是用ik_max_word分词,检索时用ik_smart分词,可以说,ik_smart的分词结果是ik_max_word分词结果的一个子集,那么理论上来讲,肯定是能够检索到数据的,那么为什么有时会检索不到呢? 对此官方网站对match_phrase的解释如下: Like…

  • es
    Elasticsearch,  技术,  服务组件

    Elasticseach 随机抽取记录

    业务场景中,特别是审核相关的一些场景,经常会有对数据进行抽取评估的需求。抽取的规则需要尽可能的平均。 当数据量小的时候,用mysql的 order by rand() 即可实现,但当数据量非常大的时候,该方法就不是很适用了,会非常的慢。 此时我们就可以借助其他的一些工具,比如elasticsearch (如果你业务中已经使用了的话,否则可以考虑其他的技术方案) 如果运用elasticsearch来实现随机抽取的目的呢?跟mysql的 order by rand() 采用一样的逻辑,elasticsearch 也支持自定义的排序规则。 如下, 设置排序规则为 (doc[‘_id’].value + params.random_salt).hashCode(), params.random_salt 为自己设置的加密盐,如我这里设置的是 random_salt = md5(time()) 以上检索条件会查询出满足条件的10条随机记录,这是运用了search, 如果想要抽取特别多的数据的话,scroll也同样适用。当然你也可以选择其他的排序规则,只要确保该规则计算的结果尽可能的随机即可。 注意:如果是想要多页的获取数据的话,必须保证多页的检索条件的sort是同样的,否则就会出现检索出相同的数据(因为每次都是按照不同的排序规则排序,获取该排序规则上,该页的数据)。当然,如果只是想要抽取少量的数据,无需多页获取的话,也可以直接使用 “script”: “Math.random()” 来获取随机数据。