FlexSearch 高级查询解析器(Resolver)使用指南
什么是FlexSearch解析器?
FlexSearch解析器(Resolver)是一个强大的查询处理工具,它允许开发者构建复杂的搜索查询逻辑。通过解析器,你可以将多个简单查询组合成复杂的布尔查询,并对结果进行精细控制。
基础用法
获取未解析结果
首先获取一个未解析的原始结果集:
const raw = index.search("简短查询", {
resolve: false
});
应用解析器方法
然后可以链式调用各种解析器方法:
raw.and( ... )
.and( ... )
.boost(2)
.or( ... , ... )
.limit(100)
.xor( ... )
.not( ... )
// 最终解析
.resolve({
limit: 10,
offset: 0,
enrich: true
});
默认解析器
最简单的使用方式是:
const raw = index.search("简短查询", {
resolve: false
});
const result = raw.resolve();
创建解析器实例
你也可以直接创建Resolver实例:
import { Resolver } from "flexsearch";
const raw = new Resolver({
index: index, // 必须传入索引
query: "简短查询"
});
const result = raw.resolve();
布尔操作链式调用
解析器的核心功能是支持布尔操作的链式调用:
// 1. 获取一个或多个未解析结果
const raw1 = index.search("查询1", { resolve: false });
const raw2 = index.search("查询2", { resolve: false, boost: 2 });
// 2. 应用解析器操作
const raw3 = raw1.and(raw2);
// raw1已改变,raw2保持不变,raw3引用raw1
// 3. 解析最终结果
const result = raw3.resolve({
limit: 100,
offset: 0
});
嵌套查询示例
const result = index.search("主查询", {
resolve: false,
boost: 2
})
.or({
and: [{
query: "子查询1"
},{
query: "子查询2"
}]
})
.not({
query: "排除查询"
})
.resolve({
limit: 100,
offset: 0
});
解析器方法详解
布尔操作方法
| 方法 | 描述 | 返回值 | |------|------|--------| | .and(options,...)
| 逻辑与操作 | Resolver或结果 | | .or(options,...)
| 逻辑或操作 | Resolver或结果 | | .not(options,...)
| 逻辑非操作 | Resolver或结果 | | .xor(options,...)
| 逻辑异或操作 | Resolver或结果 |
结果控制方法
| 方法 | 描述 | 返回值 | |------|------|--------| | .limit(number)
| 限制结果数量 | Resolver | | .offset(number)
| 设置结果偏移量 | Resolver | | .boost(number)
| 设置结果权重 | Resolver |
最终解析方法
| 方法 | 描述 | 返回值 | |------|------|--------| | .resolve(options)
| 解析最终结果 | 最终结果或Promise |
高级功能
异步查询处理
FlexSearch解析器支持两种异步处理模式:
- 并行处理 - 所有异步任务同时运行
const resolver = new Resolver({
index: index,
query: "查询1",
async: true
})
.and({
query: "查询2",
async: true
});
const result = await resolver.resolve(100);
- 队列处理 - 任务按顺序执行
const resolver = await new Resolver({
index: index,
query: "查询1",
async: true
})
.and({
query: "查询2",
queue: true
})
.resolve(100);
查询缓存
可以缓存查询结果提高性能:
import { Resolver } from "flexsearch";
const result = new Resolver({
index: index,
query: "查询1",
cache: true
})
.and({
query: "查询2",
cache: true
})
.resolve(100);
性能优化建议
- 对于简单查询,直接使用
index.search()
更高效 - 复杂查询使用解析器可以显著简化代码
- 根据场景选择合适的异步处理模式:
- 并行模式适合独立查询
- 队列模式适合有依赖关系的查询
- 合理使用查询缓存减少重复计算
通过掌握FlexSearch解析器的这些高级功能,你可以构建出更强大、更灵活的搜索解决方案。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考