我正在使用Python的通用Sphinx(虽然我也针对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 Affordable Care Act
我明白了:
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 | | | |
+--------------------+--------------+------+-----+---------+----------------+
答案 0 :(得分:1)
我似乎已经解决了这个问题,虽然我承认这都是运气不好所以它可能不是根本原因:
首先我想也许它不喜欢查询中字段的顺序我有唯一的属性字段,所以我决定将它移到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是手工编译的)
答案 1 :(得分:0)
在sphinx上生锈很少,但相信你的source { }
子句需要 sql_field_string 定义。
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_field_string = official_title
sql_query_info = SELECT * FROM bill WHERE id=$id
}
根据http://sphinxsearch.com/docs/1.10/conf-sql-field-string.html,sql_field_string声明将索引并存储用于引用的字符串。这与sql_attr_string不同,后者存储但未编入索引。