0

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

我正在尝试使用扩展匹配模式。看起来titleandsummary很好,但是索引中忽略了official_title, thestate和字段。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  |     |         |                |
+--------------------+--------------+------+-----+---------+----------------+
4

2 回答 2

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 是手工编译的)

于 2012-11-06T05:24:46.650 回答
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 不同。

于 2012-11-05T21:00:45.693 回答