0

検索キーワードなしで、フィルタリングされたデータを取得する必要があります。基本的にこのようなクエリを想像してください

select  ras.resource_id
from    resource_account_share ras, resource_account_share_contract rasc,
                                contract cnt
where   ras.id=rasc.share_id and rasc.contract_id=cnt.id and
                                (cnt.assignor_id='28' or cnt.assignee_id='28')))

私の sphinx.conf で、属性を assignor_id と assignee_id に設定し、次に assignee id と assignor id を挿入してフィルタリングしますが、API はクエリ文字列を挿入する必要がありますが、これは必要ありません。文字列を検索するフィールドすらありませんし、必要ありません。必要なのは、 assignee_id または assignor_id でフィルタリングされたデータだけです。

では、どうすればこのデータを取得できますか?


http://sphinxsearch.com/info/faq/にあるEDIT

文字列属性を持たない文字列列でフィルター処理、並べ替え、またはグループ化するにはどうすればよいですか?

複数のインデックスに対する正確な任意の長さのソートを除いて、これはすべて実行できます。

フィルタリングしてグループ化するには、文字列を一意の数値 ID に置き換えることができます。場合によっては、データベースにルックアップ ディクショナリを作成することもできます (都市や国の固定リストなど)。既存のものを使用して、文字列をそのディクショナリ内の ID に置き換え、その ID でフィルタリングしてグループ化することもできます。そうでない場合は、いつでも文字列をチェックサムに置き換えることができます。インデックス作成時に MD5() から取得した CRC32() または (任意の) 64 ビット (テーブルを変更する必要はありません!) を、それぞれ sql_attr_uint または sql_attr_bigint を使用して格納し、そのチェックサム属性でフィルター処理またはグループ化します。(数百万の文字列がある場合、CRC32() 衝突の可能性はあるものの、MD5() 衝突の可能性は実質的にゼロであることに注意してください。)

並べ替えは難しくなりますが、ある程度は可能です。まず、sql_attr_str2ordinal を使用して、すべての文字列をその序数 (このインデックスに記載されているすべての一意の文字列の並べ替えられたリスト内の連続番号) に置き換えることができます。ただし、一度に複数のインデックスを照会すると、文字化けした結果が生成されます。これは、すべてのインデックスが同じ文字列に独自の連続番号を割り当てるためです。すなわち。文字列「zzz」は、インデックス A では 1000 番ですが、同時にインデックス B では 1 番であり、A+B の両方を検索すると、誤って先頭に浮きます。次に、4 バイトまたは 8 バイトの部分文字列を抽出し、それらを属性として保存し、それらの属性で並べ替えることができます。これはさまざまなインデックスで機能しますが、最初のいくつかのバイトでのみソートします。

しかし、それを行う方法を本当に理解していません。


編集#2

わかりました..基本的には、1つの巨大なSQLクエリを持つテーブルがたくさんありますが、他のすべては基本的に同じであるため、私の問題を示しています。

テーブル

記録表

CREATE TABLE `recording` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(500) NOT NULL DEFAULT ''
) ENGINE=InnoDB AUTO_INCREMENT=4888 DEFAULT CHARSET=utf8;

Resource_account_share

CREATE TABLE `resource_account_share` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `resource_id` int(10) unsigned NOT NULL,
  `account_id` int(10) unsigned NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=33392 DEFAULT CHARSET=utf8;

Mysql クエリ

select  cmp.id, cmp.title_en as `title`,
                    date_format(cmp.released_date, '%d.%m.%Y') released_date,
                    cmp.ean, cmp.isrc, cmp.performers
            from    recording cmp
            where 1=1
            and (cmp.id in (select resource_id from resource_account_share where account_id='?')

? - はアカウント ID で、検索の送信時に挿入されます。

私がやろうとしていることはsetSelectで作られていると確信していますが、それがどのように機能するのか理解できないので、私の計画は....

1) 収録テーブルの索引付け

2) resource_account_share テーブルにインデックスを付ける

3) 次に、sphinx.conf に 2 つのソースを設定します: ソース記録とソース resource_account_share

source recording
{
    type            = mysql

    sql_host        = localhost
    sql_user        = user
    sql_pass        = password
    sql_db          = db
    sql_port        = 3306  # optional, default is 3306

    sql_query       = \
        select  cmp.id, cmp.title_en as `title`,\
                    date_format(cmp.released_date, '%d.%m.%Y') released_date,\
                    cmp.ean, cmp.isrc, cmp.performers\
            from    recording cmp

    sql_attr_uint       = id
    sql_query_info      = SELECT * FROM recording WHERE id=$id
}

source resource_account_share
{
    type            = mysql

    sql_host        = localhost
    sql_user        = user
    sql_pass        = password
    sql_db          = db
    sql_port        = 3306  # optional, default is 3306

    sql_query       = \
        select resource_id from resource_account_share

    sql_attr_uint       = account_id
    sql_query_info      = SELECT * FROM recording WHERE id=$id
}

4)次にphpファイルでresource_account_shareをaccount_idでフィルターします($cl->SetFilter('account_id',array('28'));

5) resource_account_share インデックスからデータを取得し、このデータを recroding テーブル フィルターに挿入します。

$cl->SetFilter('id',array(data_fetched_from_resource_account_share));

ここでは、実際のクエリを半分にカットしてその場で書いたため、おそらく間違いがありますが、アイデアはわかります.....私の問題は、これらのテーブルをスフィンクスとリンクする方法がわからないことです。最初にresource_account_shareテーブルをフィルタリングするだけですが、フィルタリングできないという問題に行き詰まりました。キーワードも検索する必要がありますが、ここでは必要ありません...

4

2 に答える 2

3

ドキュメントによるとhttp://sphinxsearch.com/docs/archives/1.10/matching-modes.html

SPH_MATCH_FULLSCAN は、以下のように「フルスキャン」モードを強制的に使用して、クエリに一致します。NB、フィルター、フィルター範囲、およびグループ化は引き続き適用されますが、テキスト一致は適用されないように、クエリ用語は無視されます。

あなたが使用する必要があります

$cl->setMatchMode(SPH_MATCH_FULLSCAN);
于 2014-02-07T09:35:47.810 に答える
0

$sphinx->Query('','indexname') のように、空のクエリ文字列を挿入するだけです

于 2012-10-31T12:16:20.880 に答える