0

sphinx api でフィルター/条件を設定して、構成選択に「AND」条件を追加することは可能ですか? (または「AND」条件のように振る舞う) ?

SetFilterを使用しているため、期待どおりに機能しsql_attr_multiません。見つかった一致を含む配列が作成されます...そして、ソート定義された属性は最新のものによって上書きされます。

構成選択で「AND 条件」を設定すると、正しく機能しますが、動的に使用する必要があります。

あるいは、sql_queryin php を使用して条件を動的に設定するにはどうすればよいでしょうか。

OR setSelect ("*, AND条件")

編集

私は3つのテーブルを持っています

-companies table
-projects table
-companies_projects table (company id, project_id, company_package)

同じ会社が複数のプロジェクトに参加している可能性があります。

会社のパッケージは、プロジェクトごとに異なる場合があります (並べ替えのため)。

sql_attr_multi = uint project from query; SELECT company_id, project_id FROM companies_projects

適切な会社を見つけますが、その会社が複数のプロジェクトに参加している場合、プロジェクト属性は (8, 10) になります。

プロジェクト番号について。8 - パッケージは 2、
プロジェクト番号では。10 - パッケージは 1

フィルターをかけます

$sphinxClient->setFilter('project', array(8));

問題は、company_package が (データベース内の) 最後のエントリによって上書きされていることです。その理由はわかりません。

したがって、company_packageプロジェクト番号。8 は 2 のはずですが、代わりに 1 を取得しています。witch はプロジェクト番号のパッケージです。10.

追加WHERE project_id = '8'した場合は正常に機能しsql_queryますが、動的なソリューションが必要なので、プロジェクトごとに構成ファイルを作成する必要はありません

編集:

sql_query = \
     SELECT \
     id, company, \
     company_package, UNIX_TIMESTAMP(date) AS date \
     FROM companies AS c \
     INNER JOIN companies_projects AS cp ON c.id = cp.company_id

会社テーブル: id、会社

company_projects: project_id、company_id、company_package、日付

編集

 [1] => Array
            (
                [weight] => 1
                [attrs] => Array
                    (
                        [company_package] => 2
                        [date] => 1367224201
                        [project] => Array
                            (
                               [0] => 8
                            )
                    )
            )
 [2] => Array
            (
                [weight] => 1
                [attrs] => Array
                    (
                        **[company_package] => 1** it should be 2
                        [date] => 1367224202
                        [project] => Array
                            (
                                [0] => 8
                                [0] => 10
                            )
                    )
            )

例を添付しました。適切な企業を見つけます。

最初のキーは会社番号なので問題ありません。1 はちょうどプロジェクト no.8 にあります

2番目のキーは、会社がいいえません。2は両方にありません。このような8および10のプロジェクト:

会社 1、プロジェクト 8、パッケージ = 2

会社 2、プロジェクト 8、パッケージ = 2

会社 2、プロジェクト 10、パッケージ = 1

したがって、会社は問題ありませんが、パッケージは会社 2、プロジェクト 10、パッケージ = 1 から上書きされます。このレコードを削除するか、AND project_id=8 を追加すると、すべて問題ありません。

4

1 に答える 1

0

ああ、会社ごとに 1 つのドキュメントしか取得できません。

sql_queryが最後にGROUP BY idタックしたと考えてよいでしょう。(そうではありませんが、sphinx は ID ごとに 1 つのドキュメントしか作成しません)

GROUP BY がないため、MVA は機能します。

最も簡単なのは、会社/プロジェクトの組み合わせごとに 1 つの Sphinx ドキュメントを持つことだと思います。つまり、事実上、companys テーブル自体ではなく、companys_projects を直接インデックス付けします。

sql_query_pre = SET @id=1
sql_query = SELECT @id:=@id+1, company_id, project_id, company, \
   company_package, UNIX_TIMESTAMP(date) AS date \
   FROM companies_projects AS cp \
   INNER JOIN companies AS c ON (c.id = cp.company_id)
sql_attr_unit = company_id
sql_attr_unit = project_id

(MVA は必要ありません)

次に、project_id (または company_id) にフィルターを設定して、適切な company_package を取得できます。

(これには、偽のドキュメント ID の作成が含まれます。これは、使用できる company_projects に単純なキーがないためです)

于 2013-04-30T13:40:20.070 に答える