需求:如何让ES的某个字段既能支持精确匹配查找,也能支持模糊检索?
方法:将字段的mapping设置为如下这种即可:
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
举个栗子
"properties": {
"name": {
"analyzer": "ik_max_word",
"store": true,
"type": "text"
}
上面这种配置:它只能分词匹配,做不到精确匹配。如我有两条数据
数据1:也无风雨也无晴
数据2:也无风雨也无晴2
搜索:业务风雨也无晴2
正确的结果是只返回数据2,但事实是两条数据它都返回了
怎么样才能让它只返回数据2呢?
再举个栗子
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
上面这种配置,在搜索业务风雨也无晴2的时候将只返回数据2,于是我们就 让字段同时支持精确匹配和模糊检索了。
如果索引已经添加,要更改字段类型映射请看这篇文章,不用写代码,直接postmain就可以了
https://blog.youkuaiyun.com/java_xxxx/article/details/108710260
java代码
如果java代码中对字符串按MultiMatchQueryBuilder的方式搜索,并且再添加进入boolTrem里,可以精确匹配,如搜索:“也无风雨也无晴”,结果:“也无风雨也无晴”、“也无风雨也无晴2”、“也啊无啊风啊雨啊也啊无啊晴2”
如果搜索"也无风雨也无晴2",结果:“也无风雨也无晴2”、“也啊无啊风啊雨啊也啊无啊晴2”
如果使用matchPhraseQuery,前提是索引不分词,搜索结果会比上面少了一个““也啊无啊风啊雨啊也啊无啊晴2””,达到精确匹配的效果
postFilterKeyword.should(QueryBuilders.matchPhraseQuery(fileNmae, item));
MultiMatchQueryBuilder query = QueryBuilders.multiMatchQuery(item, locations).type(MultiMatchQueryBuilder.Type.PHRASE).slop(50);
postFilterKeyword.should(query);
public static Page listArticleByEs(Page page, ArticlePub filter){
Integer pageSize = page.getPageSize();
Integer pageNumber = page.getPageNumber();
Short status = filter.getArticleStatus();
Short articleType = filter.getArticleType();
String columnIds = filter.getColumnIds();
Integer roleId = filter.getRoleId();
Integer userType = filter.getUserType();
Long siteId

本文介绍如何在Elasticsearch中设置字段映射,使字段既支持精确匹配又支持模糊检索。通过具体示例展示了配置方法及实现精确匹配的Java代码。
最低0.47元/天 解锁文章
2134





