在 Easysearch Java SDK 2.0.x 利用指南(一) 中,我们先容了 Easysearch Java SDK 2.0.2 的基本利用和批量操作功能。
在 Easysearch Java SDK 2.0.x 利用指南(二) 中,则具体先容了索引管理相干的功能,包括索引的创建、删除、开关、刷新、滚动等操作,以及新版 SDK 提供的同步和异步两种调用方式。
本篇文章将继续向大家先容 Easysearch Java SDK 2.0.2 的 Query 的利用。
1. QueryString:机动的全文检索
QueryString 查询允许开发者以类似 Easysearch Query DSL 的语法实行全文检索,非常得当处理用户输入的复杂搜索条件。
基本概念
- fields:指定要检索的字段列表。
- query:查询字符串,支持布尔操作符(如 AND、OR、NOT)。
- default_operator:当查询字符串中未明确操作符时利用的默认逻辑操作符。
- analyze_wildcard:是否对通配符查询举行分析。
代码示例
以下示例展示了怎样通过新版 Java 客户端构建一个 QueryString 查询,用于检索标题和内容中同时包含 easysearch 和 java 的文档:
- @Test
- public void testQueryString() {
- // 定义 JSON 查询字符串
- String jsonQuery = "{\n" +
- " "query_string": {\n" +
- " "fields": ["title", "content"],\n" +
- " "query": "easysearch AND java",\n" +
- " "default_operator": "AND",\n" +
- " "analyze_wildcard": true\n" +
- " }\n" +
- "}";
- // 使用 JacksonJsonpMapper 解析 JSON 字符串
- JacksonJsonpMapper mapper = new JacksonJsonpMapper();
- JsonParser parser = mapper.jsonProvider().createParser(new StringReader(jsonQuery));
- Query query = Query._DESERIALIZER.deserialize(parser, mapper);
- // 提取 QueryStringQuery 并构建最终查询
- QueryStringQuery queryStringQuery = query.queryString();
- Query finalQuery = Query.of(q -> q.queryString(queryStringQuery));
- // 输出最终查询对象
- System.out.println(finalQuery);
- }
复制代码 代码解析
- 构建 JSON 查询字符串:定义了 query_string 查询的核心参数,包括字段列表和查询条件。
- 解析 JSON:利用 JacksonJsonpMapper 将 JSON 字符串解析为 Java 对象。
- 提取 QueryStringQuery:从解析后的 Query 对象中获取 QueryStringQuery。
- 封装最终查询:通过 Query.of 方法将 QueryStringQuery 封装为最终的 Query 对象。
利用场景
- 用户输入的搜索条件需要支持布尔逻辑。
- 需要在多个字段中举行全文检索。
- 支持模糊搜索(如通配符)的场景。
2. Bool Query:构建复杂的多条件查询
Bool Query 可以将多个查询子句组合成一个高级查询。这些子句通过布尔逻辑组合在一起,用于查找结果中返回的匹配文档。
Bool Query 的核心子句
子句举动must逻辑"与"运算符。结果必须匹配此子句中的所有查询。must_not逻辑"非"运算符。所有匹配此子句中查询的文档都会从结果中排除。should逻辑"或"运算符。结果必须匹配至少一个查询。匹配的 should 子句越多,文档的相干性得分越高。你可以利用 minimum_should_match 参数设置必须匹配的最小查询数量。如果查询包含 must 或 filter 子句,则 minimum_should_match 的默认值为 0。否则,minimum_should_match 的默认值为 1。filter逻辑"与"运算符,在应用其他查询之前起首应用,以淘汰数据集。filter 子句中的查询是一个是或否选项。如果文档匹配查询,则会将其返回到结果中;否则不会返回。filter 查询的结果通常会被缓存,以实现更快的返回。利用 filter 查询可根据精确匹配、范围、日期或数字来过滤结果。 基于 JSON 的代码示例
以下代码展示了怎样通过 JSON 字符串构建一个复杂的 BoolQuery:
- @Test
- public void testBoolQueryString() {
- // 定义 JSON 查询字符串
- String jsonQuery = "{\n" +
- " "bool": {\n" +
- " "must": [\n" +
- " { "match": { "title": "easysearch" } },\n" +
- " { "match": { "content": "java programming" } }\n" +
- " ],\n" +
- " "should": [\n" +
- " { "term": { "category": "technology" } },\n" +
- " { "term": { "category": "programming" } }\n" +
- " ],\n" +
- " "must_not": [\n" +
- " { "term": { "status": "draft" } },\n" +
- " { "range": { "publish_date": { "lt": "2020-01-01" } } }\n" +
- " ],\n" +
- " "filter": [\n" +
- " { "range": { "rating": { "gte": 4 } } },\n" +
- " { "terms": { "tags": ["search", "database"] } }\n" +
- " ],\n" +
- " "minimum_should_match": 1\n" +
- " }\n" +
- "}";
- // 解析 JSON 并构建查询
- JacksonJsonpMapper mapper = new JacksonJsonpMapper();
- JsonParser parser = mapper.jsonProvider().createParser(new StringReader(jsonQuery));
- Query query = Query._DESERIALIZER.deserialize(parser, mapper);
- // 提取 BoolQuery 并构建最终查询
- BoolQuery boolQuery = query.bool();
- Query finalQuery = Query.of(q -> q.bool(boolQuery));
- // 输出最终查询对象
- System.out.println(finalQuery);
- }
复制代码 利用 Builder 模式构建 BoolQuery
新版 Java 客户端还提供了范例安全的 Builder 模式,简化了复杂查询的构建过程:
- @Test
- public void testBooleanQuery() throws IOException {
- // 构建 BoolQuery
- BoolQuery.Builder boolQueryBuilder = new BoolQuery.Builder();
- // 添加 must 子句
- boolQueryBuilder.must(new MatchQuery.Builder().field("title").query("easysearch").build()._toQuery());
- boolQueryBuilder.must(new MatchQuery.Builder().field("content").query("java programming").build()._toQuery());
- // 添加 should 子句
- boolQueryBuilder.should(new TermQuery.Builder().field("category").value("technology").build()._toQuery());
- boolQueryBuilder.should(new TermQuery.Builder().field("category").value("programming").build()._toQuery());
- // 添加 must_not 子句
- boolQueryBuilder.mustNot(new TermQuery.Builder().field("status").value("draft").build()._toQuery());
- // 添加 filter 子句
- boolQueryBuilder.filter(new RangeQuery.Builder().field("rating").gte("4").build()._toQuery());
- // 构建查询
- Query query = new Query(boolQueryBuilder.build());
- System.out.println(query);
- }
复制代码 利用场景
- 构建复杂的多条件查询。
- 满意高级搜索需求,例如结合全文检索和精确匹配。
- 实现复杂的逻辑,如过滤无关数据、优先特定条件。
3. Constant score query:同一评分的过滤查询
Constant score 查询用于包装一个 filter 查询,并为所有匹配的文档分配一个同一的相干性分数。这种查询方式不考虑词频 (TF) 和逆文档频率 (IDF),得当那些只关心文档是否匹配而不关心相干度排序的场景。
基本概念
constant_score 的参数
- filter
- (必需) 您盼望运行的过滤查询。任何返回的文档都必须匹配此查询。
- 过滤查询不盘算相干性得分。为了提高性能,Easysearch 会自动缓存常用的过滤查询。
- boost
- (可选) 用作每个匹配过滤查询的文档的常量相干性得分的浮点数。默认为 1.0。
基于 JSON 的代码示例
- @Test
- public void testConstantScoreQuery() {
- // 定义 JSON 查询字符串
- String jsonQuery = "{\n" +
- " "constant_score": {\n" +
- " "filter": {\n" +
- " "term": { "status": "published" }\n" +
- " },\n" +
- " "boost": 1.2\n" +
- " }\n" +
- "}";
- // 解析 JSON 并构建查询
- JacksonJsonpMapper mapper = new JacksonJsonpMapper();
- JsonParser parser = mapper.jsonProvider().createParser(new StringReader(jsonQuery));
- Query query = Query._DESERIALIZER.deserialize(parser, mapper);
- // 提取 ConstantScoreQuery 并构建最终查询
- ConstantScoreQuery constantScoreQuery = query.constantScore();
- Query finalQuery = Query.of(q -> q.constantScore(constantScoreQuery));
- System.out.println(finalQuery);
- }
复制代码 利用 Builder 模式构建 ConstantScoreQuery
- @Test
- public void testConstantScoreQueryBuilder() {
- // 使用 Builder 构建 ConstantScoreQuery
- ConstantScoreQuery.Builder constantScoreBuilder = new ConstantScoreQuery.Builder();
- // 创建 filter 查询
- TermQuery termQuery = new TermQuery.Builder()
- .field("status")
- .value("published")
- .build();
- // 设置 filter 和 boost
- constantScoreBuilder
- .filter(termQuery._toQuery())
- .boost(1.2f);
- // 构建最终查询
- Query query = Query.of(q -> q.constantScore(constantScoreBuilder.build()));
- System.out.println(query);
- }
复制代码 利用场景
- 作为 bool 查询的一部分
- 用于预过滤或调整特定文档集的分数
通过利用 Constant score 查询,我们可以在需要简朴过滤和同一评分的场景中得到更好的性能和更简朴的实现。这种查询方式特殊得当那些不需要复杂相干性盘算的应用场景。
总结
本文先容了 Easysearch Java SDK 2.0.2 中的三种核心查询:Query String、Bool Query 和 Constant Score。
Query String 善于机动处理用户输入的全文检索,支持布尔逻辑和通配符。Bool Query 则通过组合 must、must_not、should 和 filter 等子句,满意复杂的多条件查询需求。Constant Score 则专注于高效过滤和同一评分,适用于不需要排序的场景。
想要了解更多?
- 客户端 Maven 地址: https://mvnrepository.com/artifact/com.infinilabs/easysearch-client/2.0.2
- 更具体的文档和示例代码在 官网 持续更新中,请随时关注!
大家有啥题目或者发起,也接待随时反馈!
关于 Easysearch
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完满多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。
官网文档:https://infinilabs.cn/docs/latest/easysearch
作者:张磊,极限科技(INFINI Labs)搜索引擎研发负责人,对 Elasticsearch 和 Lucene 源码比较认识,如今重要负责公司的 Easysearch 产物的研发以及客户服务工作。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |