[ElasticSearch High Level REST] 精确搜索termQuery搜不到结果 term match phase 对比

一、先说处理方法:在字段后面加上“.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全局匹配在所有字段中去查找

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值