如何使用ES更有效率的进行多字段模糊匹配

这篇具有很好参考价值的文章主要介绍了如何使用ES更有效率的进行多字段模糊匹配。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

​ 有时候需要ES模糊多个多个和中文相关的字段,可以把多个字段合成一个逻辑意义上的字段进行模糊

相关信息

此时需要两个配置:

1、copy_to (将多个字段整合成一个字段)官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/5.5/copy-to.html

2、ngram (分词器在对纯中文或者中英文混合相关等检索的时候很犀利,无脑的将词分隔成成为几个字连接起来)官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/5.5/analysis-ngram-tokenizer.html

如下示配置看,将first_name和last_name字段copy到一个字段full_name中

注意⚠️:(这个会不会产生一个情况?用户输入的前半段和后半段,命中了字段合在一起的中间部分,如A字段值:abc,B字段值为:def,把A、B字段合并后进行模糊分词匹配的时候会不会匹配中:cd这个值?)如果是使用copyto,不用担心这个。如果你使用的是binlog同步使用字符串拼接的方式产生的字段,会产生括号中所属的情况

PUT my_index
{
  "mappings": {
    "my_type": {
      "properties": {
        "first_name": {
          "type": "text",
          "copy_to": "full_name" 
        },
        "last_name": {
          "type": "text",
          "copy_to": "full_name" 
        },
        "full_name": {
          "type": "text"
        }
      }
    }
  }
}

PUT my_index/my_type/1
{
  "first_name": "John",
  "last_name": "Smith"
}

GET my_index/_search
{
  "query": {
    "match": {
      "full_name": { 
        "query": "John Smith",
        "operator": "and"
      }
    }
  }
}

试一下没有进行额外配置ngrem默认的分词效果:会为字符创建一个offset,更加方便命中数据

GET _analyze
{
  "tokenizer": "ngram",
  "text": "我的测试"
}

#产生的效果
{
  "tokens": [
    {
      "token": "我",
      "start_offset": 0,
      "end_offset": 1,
      "type": "word",
      "position": 0
    },
    {
      "token": "我的",
      "start_offset": 0,
      "end_offset": 2,
      "type": "word",
      "position": 1
    },
    {
      "token": "的",
      "start_offset": 1,
      "end_offset": 2,
      "type": "word",
      "position": 2
    },
    {
      "token": "的测",
      "start_offset": 1,
      "end_offset": 3,
      "type": "word",
      "position": 3
    },
    {
      "token": "测",
      "start_offset": 2,
      "end_offset": 3,
      "type": "word",
      "position": 4
    },
    {
      "token": "测试",
      "start_offset": 2,
      "end_offset": 4,
      "type": "word",
      "position": 5
    },
    {
      "token": "试",
      "start_offset": 3,
      "end_offset": 4,
      "type": "word",
      "position": 6
    }
  ]
}


进行ngrem配置

min_gram和max_gram 有助于分词的效率,类似一个窗口(如下配置像一个长度1~3单位的窗口,可以在字段字符上来回滑动分词),窗口长度拉的越长,匹配的更加具体,长度越小,匹配质量越低

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 3,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_analyzer",
  "text": "2 Quick Foxes."
}

后续java示例伪代码文章来源地址https://www.toymoban.com/news/detail-502395.html


        int from = (pageNum - 1) * pageSize;
        SearchSourceBuilder builder = new SearchSourceBuilder();
 		BoolQueryBuilder rootQuery = QueryBuilders.boolQuery();
		BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
		boolQueryBuilder.must(QueryBuilders.matchQuery("full_name", "模糊匹配的内容").operator(Operator.AND));
        rootQuery.filter(boolQueryBuilder);
        builder.setQuery(rootQuery);
        builder.from(from);
        builder.size(pageSize);
        SearchRequest searchRequest = new SearchRequest("indexName");
        searchRequest.source(builder);
        try {
            SearchResponse response = client.search(searchRequest);
            return response;
        } catch (IOException e) {
            throw new BaseException("es查询连接出错:" + e.getMessage());
        }catch (ElasticsearchException e){
            throw new BaseException("es查询出错:" + e.getMessage());
        }

到了这里,关于如何使用ES更有效率的进行多字段模糊匹配的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ES中如何对text字段进行精确匹配

    在实际使用ES过程中,经常会遇到这样的问题: 既需要对一个字段进行全文检索,又要对该字段进行等值查询。 我们知道全文检索的字段类型需要设置为text,但是text字段类型又不支持term等值查询。那么怎么解决这个问题呢? 答案是 通过fields进行多字段配置 为了不同的目的

    2024年02月06日
    浏览(35)
  • es多字段模糊匹配wildcardQuery,java实现

    es 版本:7.10.1 spring-cloud版本:2.3.5.RELEASE spring-boot-starter-data-elasticsearch 版本 2.3.12.RELEASE spring-data-elasticsearch 版本 4.0.9.RELEASE es查询,需求:title或者content任意一个字段能匹配到即可 使用dsl查询语句如下,构建一个query ,should只要一个匹配即可 运行结果,可以查出数据

    2024年02月11日
    浏览(39)
  • 用ES搜索关键字并且返回模糊字段高亮

       一般来说,各个网站,首页的搜索,都会有进行全文搜索的示例,并且把模糊匹配的多个数据进行标记(高亮),这样便于全局检索关键的数据,便于客户进行浏览。基于此,本文简单介绍这种功能基本java 的 实现    由于公司页面此功能隐藏了,本文就以接口调用返回看具

    2024年02月14日
    浏览(56)
  • mybatis-plus 数据字段进行加解密入库,且加密字段支持模糊搜索

    1. 开发框架、环境 springboot+mybatis-plus+mysql5.7(oracle应该也是可以的,没有测试,但实现思路是都可以满足,懒得测oracle了,哈哈) 2. 需求介绍(背景) 需求很简单: 就是将数据存储到数据库,并且将敏感数据字段进行加密处理保存(比如:身份证,手机号,银行卡 等等)

    2024年02月09日
    浏览(54)
  • 如何使用 Typora 进行效率写作

    在数字化时代,写作已经成为我们生活中不可或缺的一部分。为了提高写作效率,寻找一款简单而功能强大的编辑器显得尤为重要。而Typora,作为一款所见即所得的Markdown编辑器,以其高效的特性和用户友好的界面吸引了众多写作者的青睐。本文将介绍如何充分利用Typora进行

    2024年01月21日
    浏览(52)
  • clickhouse 代替 es 如何对文档做模糊查询?

    模糊查询在日志存储的场景中非常普遍。 ClickHouse 作为大数据分布式引擎,理所当然地会被作为日志存储的备选方案。事实上使用 ClickHouse 作为日志存储方案,业界目前也已经在多家企业落地,比如 Uber 、石墨文档、映客、快手、携程、唯品会等。 日志查询的一个最大的特点

    2024年01月21日
    浏览(61)
  • ES:先按相关性分数进行排序,分数相同时再按其他字段排序

    最近,在公司学习ES的使用,导师给了个题目,如何对一个文档先计算分数,用分数进行排序,在分数相同的情况下再按照别的字段(如时间)进行排序,为此,从来没接触过ES的我开启了艰难的学习之路 本文参考自 ES权威指南(中文版) 以下是目录: 相关性算分描述了一个

    2024年02月05日
    浏览(42)
  • es如何修改字段类型

    演示:如下是一个包含date字段的索引ttteset-000001,接下来我们将其字段类型改为text类型

    2024年02月11日
    浏览(51)
  • ElasticSearch入门:使用ES来实现模糊查询功能

    本文针对在工作中遇到的需求:通过es来实现 模糊查询 来进行总结;模糊查询的具体需求是:查询基金/A股/港股等金融数据,要求可以根据 字段 , 拼音首字母 , 部分拼音全称 进行联想查询;需要注意的是,金融数据名称中可能不止包含汉字,还有英文,数字,特殊字符等

    2023年04月09日
    浏览(50)
  • 如何有效进行测试执行进度计划

    测试执行通常都是处于软件测试生命周期的关键路径上,它不仅在测试过程中占有重要的地位,并且也会花费大量的测试时间。针对测试执行而进行的计划,即测试执行进度计划,是进行测试执行进度控制的基础。在进行测试执行进度计划制订的时候,需要考虑哪些因素会影

    2024年02月04日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包