【问题标题】:ArangoDB FULLTEXT() search partial match does not work for substringsArangoDB FULLTEXT() 搜索部分匹配不适用于子字符串
【发布时间】:2016-10-08 00:56:40
【问题描述】:

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

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 中实现“搜索”的好方法,可以支持用户在搜索框中输入搜索字符串时所期望的搜索语义?

【问题讨论】:

    标签: arangodb aql


    【解决方案1】:

    因为全文搜索的是整个单词而不是它的一部分。

    你应该在单词前使用"prefix:"

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

    这个查询应该可以工作,以获得更多参考和其他功能:Fulltext functions

    【讨论】:

    • 对不起,我过度简化了我的例子。我也在搜索“bcd”和子字符串。我认为这意味着不支持使用索引的子字符串搜索?
    • 全文索引只能用于完全匹配和前缀匹配。子字符串匹配需要完整的集合扫描,例如FOR node IN myCollection FILTER node.myAttribute LIKE "%bcd%" RETURN node。这将匹配“bcde”、“abcd”以及“abcde”。
    • 谢谢。我开始收集尽可能多的东西。我更新了我的帖子以澄清我想要做什么。我希望有比 LIKE 所需的完整集合扫描更高效的东西
    • P.S.我发现了以下帖子(你的?):github.com/arangodb/arangodb/issues/217 关于这个,但没有跟进去年的变化。与您的示例不同,我正在扫描数以百万计的文档,并希望为用户提供更具响应性的内容。
    【解决方案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')
    

    注意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 作为针,但这无关紧要。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      相关资源
      最近更新 更多