Sphinx搜索索引某些字段而不是其他字段

时间:2012-11-05 20:34:54

标签: php python mysql sphinx

我正在使用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
}

我正在尝试使用扩展匹配模式。 titlesummary似乎没问题,但索引中会忽略official_titlestatechamber字段。例如,如果我这样做:

@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  |     |         |                |
+--------------------+--------------+------+-----+---------+----------------+

2 个答案:

答案 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不同,后者存储但未编入索引。