如何实现ArangoSearch-View仅检索指定链接集合的目标字段
问题说明
现有如下ArangoSearch View定义,其关联的col_person与col_hotel两个集合均包含名为f_name的字段:
{ "cleanupIntervalStep": 2, "writebufferSizeMax": 33554432, "commitIntervalMsec": 1000, "id": "291316", "consolidationPolicy": { "type": "tier", "segmentsBytesFloor": 2097152, "segmentsBytesMax": 5368709120, "segmentsMax": 10, "segmentsMin": 1, "minScore": 0 }, "consolidationIntervalMsec": 1000, "globallyUniqueId": "h506F923AD141/291316", "links": { "col_person": { "analyzers": [], "fields": { "f_name": { "analyzers": [ "arabic_text_analyzer", "arabic_collation_analyzer", "identity", "text_en" ] } }, "includeAllFields": false, "storeValues": "none", "trackListPositions": false }, "col_hotel": { "analyzers": [], "fields": { "f_name": { "analyzers": [ "arabic_text_analyzer", "arabic_collation_analyzer", "text_en", "identity" ] } }, "includeAllFields": false, "storeValues": "none", "trackListPositions": false } }, "writebufferIdle": 64, "primarySort": [], "primarySortCompression": "lz4", "writebufferActive": 0, "storedValues": [], "type": "arangosearch" }
执行如下AQL查询时,ArangoDB会同时在两个集合的f_name字段中执行检索,需要调整为仅检索col_person.f_name字段,不匹配col_hotel集合的同名字段:
LET QR1 = ( FOR doc_asview_global1 IN asview_global1 SEARCH ANALYZER( Like(doc_asview_global1.f_name, "%Regional%"),"identity") OR ANALYZER( LEVENSHTEIN_MATCH(doc_asview_global1.f_name, "Regional",1,true),"arabic_text_analyzer") OR ANALYZER( PHRASE(doc_asview_global1.f_name, "Regional"), "arabic_text_analyzer") LIMIT 10000 SORT BM25(doc_asview_global1) DESC RETURN doc_asview_global1 ) RETURN QR1
解决方法
核心逻辑是在SEARCH子句中显式限定检索的文档所属集合,使用ArangoDB内置的IS_SAME_COLLECTION()函数做集合匹配,该过滤条件会在ArangoSearch检索阶段直接生效,不会产生额外的后置过滤开销,性能最优。
修改后的AQL如下,仅需要在原有SEARCH条件最前方增加集合判断,和原有检索条件用AND连接即可:
LET QR1 = ( FOR doc_asview_global1 IN asview_global1 SEARCH // 限定仅检索col_person集合的文档 IS_SAME_COLLECTION("col_person", doc_asview_global1) AND ( ANALYZER( Like(doc_asview_global1.f_name, "%Regional%"),"identity") OR ANALYZER( LEVENSHTEIN_MATCH(doc_asview_global1.f_name, "Regional",1,true),"arabic_text_analyzer") OR ANALYZER( PHRASE(doc_asview_global1.f_name, "Regional"), "arabic_text_analyzer") ) LIMIT 10000 SORT BM25(doc_asview_global1) DESC RETURN doc_asview_global1 ) RETURN QR1
注意点
- 必须把多个OR连接的字段检索条件用括号包裹,再和集合过滤条件做AND运算,避免逻辑运算优先级出错导致过滤失效。
- 该方案不需要修改现有ArangoSearch View的配置,不需要重建索引,改完查询即可生效。
- 不要把集合过滤条件放到SEARCH子句外面用FILTER实现,那样会先检索两个集合的所有匹配文档再做过滤,会产生不必要的性能损耗。
内容的提问来源于stack exchange,提问作者peter bence
相关产品推荐
相关产品推荐

