一。多字段查询QueryString
流程:
- 会对查询条件进行分词。
- 然后将分词后的查询条件和词条进行等值匹配
- 默认取并集(OR)
- 可以指定多个查询字段
1.1 restAPI
例:在title和brandName字段中只要有一个字段包含“小米手机”分词字样的话,都查出来:
GET goods/_search
{
"query": {
"query_string": {
"fields": ["title","categoryName","brandName"],
"query": "苹果手机"
}
}
}
例: title 和 brandName中都得包含“小米”或“手机”:
GET goods/_search
{
"query": {
"query_string": {
"fields": ["title","brandName"],
"query": "小米 AND 手机"
}
}
}
例 :title name字段中有一个字段包含 华为 或 手机 或 AND 三个分词就行,查询粒度大。
不支持连接符,按照“华为”“AND”“手机” 三个词查询:
GET goods/_search
{
"query": {
"simple_query_string": {
"fields": ["title","categoryName","brandName"],
"query": "华为 AND 手机"
}
}
}
1.2 javaAPI
@Test
public void testStringQuery() throws IOException {
// 1.创建请求
SearchRequest searchRequest = new SearchRequest("goods");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
★★★ QueryStringQueryBuilder field = QueryBuilders.queryStringQuery("小米 AND 手机").field("title").field("brandName");
searchSourceBuilder.query(field);
searchSourceBuilder.sort("price", SortOrder.DESC);
searchRequest.source(searchSourceBuilder);
// 2.执行操作
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
// 3.获取结果
List<Goods> goodsList = new ArrayList<>();
SearchHits hits = searchResponse.getHits();
long value = hits.getTotalHits().value;
System.out.println(value);
SearchHit[] smallHits = hits.getHits();
for (SearchHit smallHit : smallHits) {
String sourceAsString = smallHit.getSourceAsString();
Goods goods = JSON.parseObject(sourceAsString, Goods.class);
goodsList.add(goods);
}
for (Goods goods : goodsList) {
System.out.println(goods);
}
}
SimpleQueryString:
QueryBuilders.simpleQueryStringQuery("小米 AND 手机").field("title").field("brandName");
二。布尔查询
2.1 rest:
1概念:
对多个查询条件连接
2链接方式:
- must(and):条件必须成立
- must_not(not):条件必须不成立
- should(or):条件可以成立
- filter:条件必须成立,性能比must高。负责上面三个条件查询结果的过滤。不会计算相关度score,因为耗性能。主要放: range 1000-2000,term 华为 。
# title必须包含手机,品牌必须小米,品牌可以是诺基亚,不能是华为,价格