0

私はPythonで汎用Sphinxを使用しています(ただし、これをPHPに対してもテストし、同じ問題が発生しました)。スフィンクスで検索できるようにしたいフィールドがいくつかあるテーブルがありますが、一部のフィールドのみがインデックスに登録されているようです。

これが私のソースです(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_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  |     |         |                |
+--------------------+--------------+------+-----+---------+----------------+
4

2 に答える 2

1

私は問題を修正したようですが、これはすべて運が悪いことを認めますので、根本的な原因ではない可能性があります:

最初に、クエリ内のフィールドの順序が気に入らないのではないかと思ったので、最後に属性フィールドが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

スフィンクスでは少しさびていますが、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 に答える