在 sphinx 搜索中,如何通过填充的字符串进行匹配?
In sphinx search, how do I match by a filled string?
希望这是一个简单的。
我正在尝试搜索名字为 john 且姓氏不是空字符串 ('') 的所有记录。在常规 SQL 中,这看起来像...
select id, firstname, lastname from users where firstname = 'john' and lastname != '';
使用 sphinx 的扩展查询语法,根据我在他们 documentation 中的理解,它应该是这样的。
select id, firstname, lastname from users where match('@firstname john @lastname !\'\'');
但是,通过上述查询,我仍然得到空白的姓氏。
+---------+------------------+----------+
| id | firstname | lastname |
+---------+------------------+----------+
| 110809 | John | |
| 313681 | John | |
| 520045 | John | |
| 554136 | John | |
如果我尝试这个查询:
select id, firstname, lastname from users where match('@firstname john')
我得到的结果与上面完全相同,让我相信 lastname 子句没有做任何事情。
有没有人以前必须用 sphinxsearch 来做这个?任何指点或帮助将不胜感激。
在您的索引(计划或 RT)配置中使用 index_field_lengths = 1。之后你应该自动拥有一个属性 <field_name>_len
可以用来过滤掉(或查找)字段内容为空的文档,例如
mysql> desc table;
+----------+------------+
| Field | Type |
+----------+------------+
| id | bigint |
| name | field |
| a | string |
| name_len | tokencount |
+----------+------------+
4 rows in set (0.00 sec)
mysql> insert into table values(1,'abc', 'abc');
Query OK, 1 row affected (0.00 sec)
mysql> insert into table values(2,'', '');
Query OK, 1 row affected (0.00 sec)
mysql> select * from table where name_len != 0;
+------+------+----------+
| id | a | name_len |
+------+------+----------+
| 1 | abc | 1 |
+------+------+----------+
1 row in set (0.00 sec)
index_field_lengths 需要为普通索引重建索引或 re-creation 为 RT 索引。
Sphinx(和 Manticore 就此而言)- 索引文档中的单词。所以匹配不到'nothing',因为索引中没有任何东西可以匹配!
作为使用长度属性的替代方法,可以使 'nothing' something 成为索引 :)
sql_query = SELECT id, firstname, IF(lastname='','_NONE',lastname) as lastname FROM ...
然后可以匹配那个
... where match('@firstname john @lastname -_NONE');
或者即使总是想排除这些行,也可以将它们从索引中排除:)
sql_query = SELECT ... FROM users WHERE lastname != ''
希望这是一个简单的。
我正在尝试搜索名字为 john 且姓氏不是空字符串 ('') 的所有记录。在常规 SQL 中,这看起来像...
select id, firstname, lastname from users where firstname = 'john' and lastname != '';
使用 sphinx 的扩展查询语法,根据我在他们 documentation 中的理解,它应该是这样的。
select id, firstname, lastname from users where match('@firstname john @lastname !\'\'');
但是,通过上述查询,我仍然得到空白的姓氏。
+---------+------------------+----------+
| id | firstname | lastname |
+---------+------------------+----------+
| 110809 | John | |
| 313681 | John | |
| 520045 | John | |
| 554136 | John | |
如果我尝试这个查询:
select id, firstname, lastname from users where match('@firstname john')
我得到的结果与上面完全相同,让我相信 lastname 子句没有做任何事情。
有没有人以前必须用 sphinxsearch 来做这个?任何指点或帮助将不胜感激。
在您的索引(计划或 RT)配置中使用 index_field_lengths = 1。之后你应该自动拥有一个属性 <field_name>_len
可以用来过滤掉(或查找)字段内容为空的文档,例如
mysql> desc table;
+----------+------------+
| Field | Type |
+----------+------------+
| id | bigint |
| name | field |
| a | string |
| name_len | tokencount |
+----------+------------+
4 rows in set (0.00 sec)
mysql> insert into table values(1,'abc', 'abc');
Query OK, 1 row affected (0.00 sec)
mysql> insert into table values(2,'', '');
Query OK, 1 row affected (0.00 sec)
mysql> select * from table where name_len != 0;
+------+------+----------+
| id | a | name_len |
+------+------+----------+
| 1 | abc | 1 |
+------+------+----------+
1 row in set (0.00 sec)
index_field_lengths 需要为普通索引重建索引或 re-creation 为 RT 索引。
Sphinx(和 Manticore 就此而言)- 索引文档中的单词。所以匹配不到'nothing',因为索引中没有任何东西可以匹配!
作为使用长度属性的替代方法,可以使 'nothing' something 成为索引 :)
sql_query = SELECT id, firstname, IF(lastname='','_NONE',lastname) as lastname FROM ...
然后可以匹配那个
... where match('@firstname john @lastname -_NONE');
或者即使总是想排除这些行,也可以将它们从索引中排除:)
sql_query = SELECT ... FROM users WHERE lastname != ''