@雅各布
不久前我已经实现了名称搜索。首先,我使用 Lucene 标准分析器将名称拆分为令牌。然后 foreach 标记我索引它。
Tokennizer 代码在这里,非常简单
对于 Cassandra 的设计
CREATE TABLE search_index
(
search_type text, // type of search, can be 'FIRSTNAME', 'LASTNAME' or 'EMAIL'
value text, // indexed valued of firstname, lastname or email
user_id bigint, // id of user having the searched firstname, lastname or email
PRIMARY_KEY(search_type,value)
);
搜索以'Jo'开头的名字:
SELECT * FROM search_index WHERE search_type='FIRSTNAME' AND value>='Jo' AND value<'Jo'+'b\uFFFF'
'b\uFFFF'表示 UTF-8 编码中的最后一个字符。通过这样的查询,您将能够找到所有以'Jo'开头的名字。它可以是'John' , 'Johnny' , 'Josh', ... 直到'Jo'+'b\uFFFF'
对于姓氏或电子邮件的搜索,它是完全相同的技术。
请注意,使用Cassandra,您只能通过完全匹配的字符串或从语义开始进行搜索。使用简单设计的包含语义进行搜索是不可能的。