Well,不要刷屏了

es实现类似sql中like的功能('%aaa%')

Elasticsearch | 作者 Kayle | 发布于2020年04月01日 | 阅读数:5020

想用es实现类似sql中like的功能('%aaa%'),查询车牌号的,要前后模糊匹配,不要分词(用户输入'AAA',检索的结果中'AAA'需要连在一起,不能是'AABA',试过分词器:例如用户输入'鄂A',会将'鄂'开头的都查询出来,猜想应该是分词器对'鄂A'进行了分词,将‘鄂’,‘A’匹配的都查询出来),不使用wildcard等效率慢的查询,数据量10TB+,,基于时间序列的索引使用alias查询的,目前使用的wildcard查询,想要用其他的方式替换掉
已邀请:

caizhongao

赞同来自:

你的情况,用分词也能实现,用match_phrase查询吧,能满足你的需求,match_phrase是要求所有分词都满足并且顺序也一致

wangguoqing - 10后IT难

赞同来自:

可以使用 NGram 分词器处理模糊匹配

Kayle

赞同来自:

问题目前已经已经解决了。使用了自定义的分词器实现的。
分词器代码:
{
  "index": {
    "analysis": {
      "analyzer": {
        "char_analyzer": {
          "filter": "uppercase",
          "tokenizer": "char_tokenizer"
        }
      },
      "tokenizer": {
        "char_tokenizer": {
          "pattern": "|",
          "type": "pattern"
        }
      }
    },
    "number_of_shards": "20"
  }
}
 
在hphm的mapping中设置自定义的分词器,使用如下代码:
查询的代码:QueryStringQueryBuilder queryBuilder = QueryBuilders.queryStringQuery("33")
.field("hphm").type(MultiMatchQueryBuilder.Type.PHRASE).minimumShouldMatch("100%");

要回复问题请先登录注册