ArangoDB多属性多词模糊搜索实现困境求助
ArangoDB多属性多词模糊搜索实现方案
1. 自定义分析器配置
创建适配模糊搜索的分析器,兼顾小写转换、分词,同时支持字符差异匹配的预处理:
db._createAnalyzer("fuzzy_search_analyzer", { "type": "custom", "tokenizer": { "type": "standard" }, "filter": [ { "type": "lowercase" }, { "type": "ngram", "min": 2, "max": 10, "preserveOriginal": true } ] });
该分析器会将文本转小写、按标准规则分词,同时生成2-10长度的ngram,既支持前缀匹配,也能兼容单个字符差异的模糊场景。
2. 创建ArangoSearch视图
针对需要搜索的多属性(示例假设文档包含location、year核心字段),创建绑定分析器的搜索视图:
db._createView("docs_search_view", "arangosearch", { "links": { "your_collection_name": { // 替换为你的目标集合名 "fields": { "location": { "analyzers": ["fuzzy_search_analyzer"] }, "year": { "analyzers": ["fuzzy_search_analyzer"] } // 按需添加其他需搜索的属性 }, "includeAllFields": false, "storeValues": "none" } } });
3. 编写AQL查询语句
针对输入“Macao 2024”,实现词序无关的模糊匹配,优先返回含2024的文档并取前3条:
FOR doc IN docs_search_view SEARCH ANALYZER( (PHRASE(doc.location, "macao", "editDistance", 1) OR PHRASE(doc.year, "macao", "editDistance", 1)) AND (PHRASE(doc.location, "2024") OR PHRASE(doc.year, "2024")), "fuzzy_search_analyzer" ) SORT BM25(doc) DESC // 按BM25算法排序,匹配度高的结果靠前 LIMIT 3 RETURN doc
核心说明:
editDistance:1允许单个字符差异,刚好适配Macao与Macau的匹配需求- 通过OR逻辑覆盖多属性,确保任意属性命中关键词即可返回结果
- BM25排序会优先返回同时匹配两个关键词的文档,满足优先展示2024年文档的要求
额外注意事项
- 若需扩展更多搜索属性,只需在视图
fields中添加对应字段,并在查询中补充OR条件 - 可根据数据特征调整分析器中ngram的
min/max值,优化匹配精度 - 测试时可先验证单个关键词的匹配效果,再逐步组合多词查询
内容的提问来源于stack exchange,提问作者Ivan Clavijos
相关产品推荐
相关产品推荐

