Elasticsearch

  • 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()” 来获取随机数据。

  • es
    Elasticsearch,  技术,  服务组件

    Eelasticsearch sort 注意事项

    Eelasticsearch中文档的默认_id是字符串类型的,即便你往里面写入的是整数值。 这也就导致,如果要是根据_id进行排序的话,实际是依据的字符串的大小比较,而非整数的大小比较。 举例说明: es创建索引, mapping如下: es中写入了部分测试数据: 通过_id降序取出数据: 可以看到,取到的第一条数据,并非预料中的100000001,而是99999999,这就是因为es对_id排序比较时,是将其当做字符串进行的比较,从而得到’99999999′ > ‘100000001’的结论。 此时,我们更换排序字段,改为整数类型的 mysql_id2, 则可以得到符合预期的结果: 综上,进行排序查询时,需要确保待排序的字段类型是否符合你的排序需求,从而避免以上误排序的情况出现。

  • es
    Elasticsearch

    elasticsearch同时支持精确和模糊搜索

    我们进行检索时,通常需要既支持模糊搜索也支持精确搜索,下面是elasticsearch的实现方式 情况1: 空索引 这种情况,非常的简单,只要给予一个字段两种解析方式即可 “properties”: {     “name”: {         “analyzer”:”ik_smart”,         “type”:”text”,         “fields”: {             “keyword”: {                 “type”:”keyword”,                 “ignore_above”:256             }           }       } } 情况2: 非空索引 1. 此时,首先修改mapping的配置 curl -H “Content-Type:application/json” -X PUT http://127.0.0.1:9220/my_index/_doc/_mapping -d ‘{ “properties”:{…

  • es
    Elasticsearch

    mac本地docker部署ElasticSearch6

    下载 Elasticsearch 镜像 docker pull elasticsearch:6.8.0 运行 Elasticsearch 镜像 docker run -d --name es -p 9200:9200 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms200m -Xmx200m" elasticsearch:6.8.0 -d:以后台的方式运行; --name es:指定容器的名称为 es; -p 9200:9200 将容器的 9200 端口挂载到宿主机的 9200 端口上;…