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

时间:2016-10-08 00:56:41

标签: arangodb aql

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

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

我在myCollection中有一个节点,myAttribute ==" abcdef"和myAttribute上有一个全文索引,上面的查询工作得很好,并返回一个结果。但是,以下查询不返回任何结果:

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

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

谢谢!

- 更新:我过度简化了上述查询,试图让它简短易懂。我应该提供一个示例查询,例如:

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

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

对于过度简化感到抱歉。希望这更清楚。有没有一种很好的方法来实现"搜索"在ArangoDB中,它将支持用户在搜索框中输入搜索字符串时所期望的搜索语义?

2 个答案:

答案 0 :(得分:2)

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

你应该在单词之前使用"前缀:"

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

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

答案 1 :(得分:0)

如果只想查找子字符串,请考虑使用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作为针,但这无关紧要。)