Cassandra 中的特殊字符搜索
Special character search in Cassandra
我有一个“user
”table,如下所示,
user_id | user_name | user_phone
---------+-----------+-------------
23 | user, | 12345678910
5 | user^ | 12345678910
10 | user- | 12345678910
16 | user{ | 12345678910
13 | user= | 12345678910
11 | user_ | 12345678910
1 | user@ | 12345678910
19 | user" | 12345678910
8 | user( | 12345678910
0 | user! | 12345678910
2 | user# | 12345678910
4 | user% | 12345678910
18 | user[ | 12345678910
15 | user} | 12345678910
22 | user< | 12345678910
27 | user/ | 12345678910
20 | user: | 12345678910
7 | user* | 12345678910
6 | user& | 12345678910
9 | user) | 12345678910
14 | user| | 12345678910
26 | user? | 12345678910
21 | user; | 12345678910
17 | user] | 12345678910
24 | user> | 12345678910
25 | user. | 12345678910
12 | user+ | 12345678910
3 | user$ | 12345678910
我对“user_name
”字段进行了索引,
CREATE CUSTOM INDEX user_name_idx ON user ("user_name") USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {'mode': 'CONTAINS', 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.StandardAnalyzer', 'case_sensitive': 'false'};
但是当我像下面这样搜索时,
select * from user where "user_name" LIKE '%u%'
-> 这个有效
select * from user where "user_name" LIKE '%,%'
-> 这是不工作
None 的特殊字符在 Cassandra 中工作。
我在这里做错了什么? Cassandra如何支持特殊字符搜索?
与索引有关吗?
您正在使用 StandardAnalyzer
,它会删除特殊字符
如果你想保留特殊字符使用NonTokenizingAnalyzer
示例:
CREATE CUSTOM INDEX user_name_idx
ON user ("user_name") USING 'org.apache.cassandra.index.sasi.SASIIndex'
WITH OPTIONS = {'mode': 'CONTAINS', 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer', 'case_sensitive': 'false'};
示例输出:
cqlsh:test> SELECT * FROM user WHERE user_name LIKE '%,%';
user_id | user_name | user_phone
---------+-----------+------------
23 | user, | 12345678910
我有一个“user
”table,如下所示,
user_id | user_name | user_phone
---------+-----------+-------------
23 | user, | 12345678910
5 | user^ | 12345678910
10 | user- | 12345678910
16 | user{ | 12345678910
13 | user= | 12345678910
11 | user_ | 12345678910
1 | user@ | 12345678910
19 | user" | 12345678910
8 | user( | 12345678910
0 | user! | 12345678910
2 | user# | 12345678910
4 | user% | 12345678910
18 | user[ | 12345678910
15 | user} | 12345678910
22 | user< | 12345678910
27 | user/ | 12345678910
20 | user: | 12345678910
7 | user* | 12345678910
6 | user& | 12345678910
9 | user) | 12345678910
14 | user| | 12345678910
26 | user? | 12345678910
21 | user; | 12345678910
17 | user] | 12345678910
24 | user> | 12345678910
25 | user. | 12345678910
12 | user+ | 12345678910
3 | user$ | 12345678910
我对“user_name
”字段进行了索引,
CREATE CUSTOM INDEX user_name_idx ON user ("user_name") USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {'mode': 'CONTAINS', 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.StandardAnalyzer', 'case_sensitive': 'false'};
但是当我像下面这样搜索时,
select * from user where "user_name" LIKE '%u%'
-> 这个有效
select * from user where "user_name" LIKE '%,%'
-> 这是不工作
None 的特殊字符在 Cassandra 中工作。
我在这里做错了什么? Cassandra如何支持特殊字符搜索?
与索引有关吗?
您正在使用 StandardAnalyzer
,它会删除特殊字符
如果你想保留特殊字符使用NonTokenizingAnalyzer
示例:
CREATE CUSTOM INDEX user_name_idx
ON user ("user_name") USING 'org.apache.cassandra.index.sasi.SASIIndex'
WITH OPTIONS = {'mode': 'CONTAINS', 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer', 'case_sensitive': 'false'};
示例输出:
cqlsh:test> SELECT * FROM user WHERE user_name LIKE '%,%';
user_id | user_name | user_phone
---------+-----------+------------
23 | user, | 12345678910