ArangoSearch中ANALYZER()内IN与==的困惑及多字段全文检索需求
ArangoSearch 多字段全文检索解惑与实现
示例代码逻辑解析
你觉得示例逻辑颠倒,是因为混淆了常规AQL操作符和ArangoSearch SEARCH子句的特殊适配行为:
- 在
SEARCH ANALYZER(doc.description IN TOKENS("dinosaur park", "text_en"), "text_en")中,IN并非常规的“x是否在y集合中”,而是反向匹配:ArangoSearch会先对doc.description用指定分析器分词(外层ANALYZER函数统一指定规则),再检查这些分词是否包含TOKENS("dinosaur park", "text_en")生成的所有分词(逻辑为AND,即所有查询分词都要命中)。 - 第二个示例
TOKENS("dinosaur park", "text_en") ALL == doc.description,本质和第一个示例效果一致:ALL ==会验证查询生成的每个分词,是否都能在doc.description的分词结果中找到,只是写法不同。
ANALYZER函数的核心作用是统一查询与索引的分词规则,确保两者使用相同的分析器处理文本,不存在所谓“隐式聚合”,只是SEARCH子句对操作符做了适配索引的反向解析。
多字段全文检索实现方案
你的需求完全可行,通过组合OR和AND逻辑即可实现:将查询内容分词后,要求所有分词都命中name或description字段(每个查询分词至少命中其中一个字段,且所有分词必须全部命中)。
假设你的ArangoSearch视图名为my_view,集合名为my_collection,查询内容为"your query text",对应的AQL语句如下:
写法一(基于ALL ==)
FOR doc IN my_view SEARCH ANALYZER( (TOKENS("your query text", "text_en") ALL == doc.name) OR (TOKENS("your query text", "text_en") ALL == doc.description) , "text_en") RETURN doc
写法二(基于IN反向匹配)
FOR doc IN my_view SEARCH ANALYZER( doc.name IN TOKENS("your query text", "text_en") OR doc.description IN TOKENS("your query text", "text_en") , "text_en") RETURN doc
扩展:允许分词分散在两个字段
如果不需要所有分词命中同一个字段(比如一个分词在name,另一个在description也符合要求),可以使用以下语句:
FOR doc IN my_view SEARCH ANALYZER( TOKENS("your query text", "text_en") ALL IN (doc.name, doc.description) , "text_en") RETURN doc
内容的提问来源于stack exchange,提问作者Eric Altendorf
相关产品推荐
相关产品推荐

