在 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 != ''