一、term查询
-
不会对查询字段进行分词,也就是如果es中的数据为「华为5g手机」,那通过term指定查询条件为「华为手机」时,是查不到该条数据的。
-
一般用term查询es中字段类型为keyword的字段,因为keyword不会分词
GET 索引名称/_search
{
"query": {
"term": {
"字段名称": {
"value": "查询条件"
}
}
}
}
/**
* termQuery 词条查询(不分词)
*/
@Test
public void testTermQuery() throws IOException {
SearchRequest searchRequest = new SearchRequest("goods");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
QueryBuilder termQuery = QueryBuilders.termQuery("title", "title1");
sourceBuilder.query(termQuery);
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits searchHits = searchResponse.getHits();
long value = searchHits.getTotalHits().value;
System.out.println("总记录数:" + value);
SearchHit[] hits = searchHits.getHits();
List<Goods> goodsList = new ArrayList<>();
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
Goods goods = JSON.parseObject(sourceAsString, Goods.class);
goodsList.add(goods);
}
goodsList.forEach(c -> System.out.println(JSON.toJSONString(c)));
}
二、match查询
- 会对查询条件进行分词
- 然后将分词后的查询条件和词条进行等值匹配(等值匹配值的是必须完全匹配,比如华为手机分词为华为和手机后,在对这两词进行查询时,只有完全匹配华为或手机的数据才能被查到)
- 默认取并集(可以设置)
GET 索引名称/_search
{
"query": {
"match": {
"字段名称": "查询条件"
}
}
}
GET 索引名称/_search
{
"query": {
"match": {
"字段名称": "查询条件",
"operator": "操作(or或and)"
}
}
}
- 默认取并集,也就是「operator」为or;如果设置为and,表示取交集
- 比如查询「华为手机」,默认为or,那么
查出的数据 = 查「华为」得到的 || 查「手机」得到的;
如果改为and,那么
查出的数据 = 查「华为」得到的 && 查「手机」得到的
/**
* matchQuery 词条分词查询(分词)
*/
@Test
public void testMatchQuery() throws IOException {
SearchRequest searchRequest = new SearchRequest("goods");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("title", "title1");
// 指定操作方式为并集or 还是 交集and;不设置的话默认为or
matchQuery.operator(Operator.AND);
sourceBuilder.query(matchQuery);
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits searchHits = searchResponse.getHits();
long value = searchHits.getTotalHits().value;
System.out.println("总记录数:" + value);
SearchHit[] hits = searchHits.getHits();
List<Goods> goodsList = new ArrayList<>();
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
Goods goods = JSON.parseObject(sourceAsString, Goods.class);
goodsList.add(goods);
}
goodsList.forEach(c -> System.out.println(JSON.toJSONString(c)));
}