如何在rethinkdb上的二级索引中使用正则表达式?

时间:2016-02-25 12:39:16

标签: rethinkdb

我在数据库“db”中的文档“car”中的rethinkdb中有超过300,000条记录。 当我尝试用属性“name”的过滤器进行“widlcard搜索”时,需要永远加载。这是代码:

r.db('db').table('car').filter(r.row('name').match("(?i).\*"+search_string+".\*")) 

其中search_string是“汽车”名称的一部分。

这是有效的,但大多数情况下它需要永远(我的意思是永远)。

现在我已经在文件“car”上为属性“name”创建了二级索引,但我不知道如何在getAll上使用该“通配符”搜索。

r.db('db').table('car').getAll(r.row('name').match("(?i).\*"+search_string+".\*"), {index:"name"})

当然这不起作用。

在这个网址上:https://rethinkdb.com/blog/1.6-release/我发现了这个:

// Create a secondary index for all users whose first names begin with `S`
r.table('users').indexCreate('starts_with_S', r.row('first_name').match('S.*').ne(null))

// Efficiently get all the users where `first_name` begins with `S`
r.table('users').getAll(true, {index: 'starts_with_S'})

但我不知道这有多大帮助。我觉得这只是拼了命地对“名”每个搜索创建索引。

当匹配完整字符串时,我的索引“name”上的getAll正在工作,但这并不是我要求的。

我可以看到很多人都有同样的问题。

可能有任何解决方案吗?

2 个答案:

答案 0 :(得分:1)

您想要的更适合其他具有全文搜索支持的数据库,如ElasticSearch。看看这篇文章:https://www.rethinkdb.com/docs/elasticsearch/

RethinkDB没有任何功能可以对索引进行全文搜索,也不对索引应用任意功能。它非常局限于可以对getAllbetween等索引执行何种操作。

答案 1 :(得分:1)

您可能希望使用“名称”字符构建二级索引,这些字符分割并逐步增加,包括更多字符。你可以这样做:

{{1}}

假设您的名字是'Volvo',将返回以下内容: [ “V”, “Vo”, “Vol”, “Volv”, “沃尔沃” ]

调整该查询以获得所需的结果,然后在该对象数组上创建一个辅助多索引(这可能有点棘手,因此您可能需要参考此问题以获得指导:{{3} })。

然后简单地执行一个r.db('test')。table('names')。getAll('query',{index:'your_new_index_name'})这应该可以解决问题,因为你将能够查询'Volv','Vol','Volvo'等。

但请注意,这仅适用于您的查询从单词的开头开始的情况:因此,如果您的列表中有“Renault Kadjar”,则如果用户输入“雷诺”,它将会起作用,但它会不是如果他们输入'Kadjar'(你需要更多地调整该查询以将你的名字分成单词并将它们进一步拆分)。