Elasticsearch查询以逗号拼接的字符串类型数据,类似于数据库Mysql和Oracle的find_in_set函数查询

例如ES存储库中的ids字段数据如下:

ids
1
3
1,3
2,3,4
1,2,4,5

入参id为3,查询期望返回结果数据为:

result
3
1,3
2,3,4

Mysql或Oracle实现

<sql id="bean_where_clause">
    <where>
        <trim prefixOverrides="AND">
        	……
	        <if test="ids != null">
	            AND FIND_IN_SET(id, #{ids})
	        </if>
	    </trim>
    </where>
</sql>

Elasticsearch实现
1、添加逗号的自定义分词器,如comma
2、创建mappings,将字段设置为text类型
3、为该字段指定逗号分词器

{
    "settings": {
        "analysis": {
            "analyzer": {
                "comma": {
                    "pattern": ",",
                    "type": "pattern"
                }
            }
        }
    },
    "mappings": {
        "properties": {
            "ids": {
                "type": "text",
                "analyzer": "comma",
                "search_analyzer": "comma"
            }
        }
    }
}

4、查询方法入参

SearchRequest request = new SearchRequest("ES库名");
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.termQuery("ids", 入参id));
request.source().query(boolQueryBuilder);
……