首页 文章

ArangoDB FULLTEXT()搜索部分匹配对子字符串不起作用

提问于
浏览
2

我正在运行类似于以下内容的简单查询:

FOR node IN FULLTEXT("myCollection", "myAttribute", "abcdef") 
    RETURN node

我在myCollection中有一个节点,myAttribute ==“abcdef”,myAttribute上有一个全文索引,上面的查询工作正常并返回一个结果 . 但是,以下查询不返回任何结果:

FOR node IN FULLTEXT("myCollection", "myAttribute", "abcde") 
    RETURN node

文档中的示例在一个句子中搜索单词“the”,所以我希望FULLTEXT()搜索“abcde”应匹配“abcdef” . 有人可以向我解释我缺少什么或需要做什么来使FULLTEXT(“myCollection”,“myAttribute”,“abcde”)找到我的节点myAttribute ==“abcdef” .

谢谢!

  • 更新:我过度简化了上面的查询,试图让它简短易懂 . 我应该提供一个示例查询,例如:
FOR node IN FULLTEXT("myCollection", "myAttribute", "bcde") 
    RETURN node

展示我想做什么和什么不行 . ArangoDB是否支持以任何方式使用索引进行子串搜索 . 我正在尝试向我的应用程序添加文本搜索,并且担心使用LIKE将导致对多个字段上的每个集合进行完整的集合扫描(不区分大小写)并且不会扩展 . 这篇文章实际上是关于如何在数据库中的多个集合(以及许多但不是所有属性)中执行高性能文本搜索 .

很抱歉过于简单化了 . 希望这更清楚 . 有没有一种在ArangoDB中实现“搜索”的好方法,它将支持用户在搜索框中输入搜索字符串时所期望的搜索语义?

2 回答

  • 0

    因为全文搜索整个单词不属于它 .

    你应该在这个词之前使用 "prefix:" .

    FOR node IN FULLTEXT("myCollection", "myAttribute", "prefix:abcde") 
        RETURN node
    

    此查询应该有效,以获取更多参考和其他功能:Fulltext functions

  • 2

    如果您只想查找子字符串,请考虑使用CONTAINS而不是LIKE .

    我使用单词 foo 作为针,进行了十次这样的简单比较:

    // This query took ca. 20-22ms:
    FOR t IN texts
        FILTER LIKE(t.text, '%foo%', true)
        RETURN KEEP(t, 'text', 'create_time')
    
    // This query took ca 4-6 ms:
    FOR t IN texts
        FILTER CONTAINS(t.text, 'foo')
        RETURN KEEP(t, 'text', 'create_time')
    

    Note CONTAINS 区分大小写,而 LIKE 的第三个参数使大小写不敏感成为一个选项 .

    为了解决这个问题,我可以添加LOWER,如果可能的话:在将文本插入数据库之前预处理文本 .

    // This query took ca 11-13 ms:
    FOR t IN texts
        FILTER CONTAINS(LOWER(t.text), 'foo')
        RETURN KEEP(t, 'text', 'create_time')
    

    This issue可能相关,这与此问题有关:On multiple index usage in ArangoDB .

    (我实际上使用了非英语单词而不是 foo 作为针,但那是无关紧要的 . )

相关问题