我正在将通用 Sphinx 与 Python 结合使用(尽管我也针对 PHP 进行了测试并遇到了同样的问题)。我有一个表,其中有几个字段,我希望能够在 sphinx 中搜索,但似乎只有某些字段被索引。
这是我的源代码(dbconfig 只有连接信息):
source bill_src : dbconfig
{
sql_query = \
SELECT id,title,official_title,summary,state,chamber,UNIX_TIMESTAMP(last_action) AS bill_date FROM bill
sql_attr_timestamp = bill_date
sql_query_info = SELECT * FROM bill WHERE id=$id
}
这是索引
index bills
{
source = bill_src
path = /var/data/bills
docinfo = extern
charset_type = sbcs
}
我正在尝试使用扩展匹配模式。看起来title
和summary
都不错,但是official_title
、state
和chamber
字段在索引中被忽略。例如,如果我这样做:
@official_title 平价医疗法案
我得到:
query error: no field 'official_title' found in schema
但是使用 @summary 进行相同的查询会产生结果。我缺少什么想法吗?
编辑 这是我尝试索引的表:
+--------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| bt50_id | int(11) | YES | MUL | NULL | |
| type | varchar(10) | YES | | NULL | |
| title | varchar(255) | YES | | NULL | |
| official_title | text | YES | | NULL | |
| summary | text | YES | | NULL | |
| congresscritter_id | int(11) | NO | MUL | NULL | |
| last_action | datetime | YES | | NULL | |
| sunlight_id | varchar(45) | YES | | NULL | |
| number | int(11) | YES | | NULL | |
| state | char(2) | YES | | NULL | |
| chamber | varchar(45) | YES | | NULL | |
| session | varchar(45) | YES | | NULL | |
| featured | tinyint(1) | YES | | 0 | |
| source_url | varchar(255) | YES | | | |
+--------------------+--------------+------+-----+---------+----------------+
最佳答案
我似乎已经解决了这个问题,尽管我承认这完全是运气不好,所以它可能不是根本原因:
首先,我想它可能不喜欢查询中字段的顺序,我只有最后一个属性字段,所以我决定将其移到 ID 之后:
SELECT id, UNIX_TIMESTAMP(last_action) AS bill_date, \
title,official_title,summary,state,chamber, FROM bill
这并没有解决问题。
其次,我注意到所有示例日期字段都使用 UNIX_TIMESTAMP
进行转换,然后别名为相同的名称,因此我更改了它,而不是 UNIX_TIMESTAMP(last_action) AS bill_date
到 UNIX_TIMESTAMP(last_action) AS last_action
...第一次尝试让我绊倒了,因为它仍然不起作用。
最后,我完全删除了日期并成功添加了每个字段(每次都重新索引和测试)。每次它都有效,最后我在末尾添加了日期字段,并且我能够按它排序并搜索所有字段。所以最终的查询是:
SELECT \
id,title,official_title,summary,state,chamber, \
UNIX_TIMESTAMP(last_action) AS last_action FROM bill
看来属性字段必须位于全文字段之后,并且别名必须与实际字段名称相同。我觉得很奇怪,日期字段看起来很好,但其他字段突然消失了(随机!)。
我希望这对其他人有帮助,尽管我觉得这可能是某种孤立的错误,不会影响很多人。 (这是在 OSX 上,sphinx 是手工编译的)
关于php - Sphinx 搜索对某些字段建立索引,但对其他字段不建立索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13239946/