一、先说处理方法:在字段后面加上“.keyword”
QueryBuilder queryBuilder = QueryBuilders.termQuery(doc字段+“.keyword”, "希望匹配的值");
方法二:
将字段的type设置为keyword
将该字段设置成 not_analyzed 无需分析的
二、查询使用时的坑点
1、使用HTTP拼接请求的方式 大概长这样的方式:
GET /customer/doc/_search/
{
"query": {
"term": {
"title": "blog"
}
}
}
名称 | 方式 | 是否分词 | 是否需要指定字段 | 效果 |
term | 精准匹配 | 否 | 是 | 一个词语的时候和match效果一样 |
match | 模糊匹配 | 是 | 是 | 匹配范围最宽 |
match_phrase | 顺序匹配 | 是 | 是 | 每个分词的顺序要求一样 |
query_string | 全局匹配 | 是 | 否 | 在所有字段中去查找 |
2、使用Java High Level REST Client方式 大概长这样的方式:
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
...
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", "");
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("tag", "体育");
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("publishTime");
...
BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
boolBuilder.must(matchQueryBuilder);
boolBuilder.must(termQueryBuilder);
boolBuilder.must(rangeQueryBuilder);
sourceBuilder.query(boolBuilder);
SearchRequest searchRequest = new SearchRequest(index);
searchRequest.source(sourceBuilder);
try {
SearchResponse response = rhlClient.search(searchRequest);
} catch (IOException e) {
...
}
名称 | 方式 | 是否分词 | 是否指定字段 | 效果 |
termQuery | 精准匹配 | 否 | 是 | 中文全匹配查询不到官方建议用matchPhraseQuery替代,或者用文章开头的方式替代即可 |
matchQuery | 模糊匹配 | 是 | 是 | 匹配范围最宽 |
matchPhraseQuery | 顺序匹配 | 是 | 是 | 每个分词的顺序要求一样 |
queryStringQuery | 全局匹配 | 是 | 否 | 在所有字段中去查找 |