1

私はWebアプリを構築しており、フリーテキスト検索にdjangoとSphinxを使用しています。検索をリクエストする前に追加の制限を適用する必要があります。2つのテーブルを検討してください。

エンティティ
ID
タイトル の
説明
created_by_idupdated_by_idcreated_dateupdated_date
_
_

EntityUser
identity_id [ 上記の表への FK
]
joining_user_idis_authorized
created_by_id updated_by_id
created_dateupdated_date



メインテーブルEntityのRTインデックスを作成しましたが、すべて正常に機能しますが、ユーザーが参加しているエンティティ、つまり特定のuser_idとentity_idが存在する場合、エンティティユーザーにis_authorized=1のレコードのみをクエリします。問題は、文字列フィールドがないため、EntityUserのインデックスを作成できないことです。このテーブルには、ご覧のとおり整数/タイムスタンプしか保持されていません。そのテーブルのインデックスを作成できたとしても、別のidexへのサブクエリを含むクエリをSphinxQLで作成できるかどうかはわかりません。Sphinxが非常に大きなプロジェクトで大成功を収めて使用されたことを知っているので、それがSphinxの制限ではないかと思います-DB /アプリケーションの設計が悪いのか、適切なRTインデックスを作成する方法の知識が漏れているのでしょうか。上記の制限を使用できるように、既存のインデックスを何らかの方法で拡張できますか?

SphinxがMySQL側でレコードのIDを返した後、追加の制限を適用できると考えていましたが、それは機能しません。重みが最も高いN個のレコードが返されますが、追加の制限を適用すると、結果が空になる可能性があります。したがって、検索領域を取得してから、ユーザーが表示できる可能性のあるエンティティに対してのみクエリを実行する必要があります。

4

2 に答える 2

0

http://sphinxsearch.com/docs/current.html#attributesの例を採用すると、confで次のようなものを使用できる可能性があります。

...
sql_query = SELECT app_entity.id as id, 
                   app_entity.title as title, 
                   app_entity.description as description,
                   app_entityuser.id as userid
            FROM app_entity, app_entityuser
            WHERE app_entity.id = app_entityuser.entity_id AND app_entityuser.is_approved = 1

sql_attr_uint = id
sql_attr_uint = userid
...

私は免責事項を提供する必要があります:私はこれを試していません。

関連するSO投稿を見つけましたが、完全に解決されたようには見えません。属性を使用したDjango-sphinx結果フィルタリング?

幸運を!

于 2012-10-25T01:58:26.173 に答える
0

実際、私は答えを見つけました。それはアプリケーションやDBの設計とは何の関係もありません。実際、これは簡単です。単純なインデックス(rt_attr_multiまたはrt_attr_multi_64)の場合と同じように、RTインデックスにMVAを使用する必要があります。構成ファイルでは、次のようなことを行う必要があります。 次に、エンティティに参加して承認されたユーザーのIDを入力します。問題は、RTインデックスでMVAを使用する方法を理解できなかったということでしたが、明確ではありませんでした。RTインデックスとMVAを使用した実際の単語の例は十分ではないと思うので、同様の問題を解決するためにこれを共有しました。 アップデート:

...
rt_attr_multi = entity_users
}




はRTインデックスを生成するために最後の1時間戦っていて、常に「不明な列:'entity_users'」を取得していました。最後に理由を見つけました-MVAをRTインデックスに追加する場合(プレーンでも同じかどうかはわかりません)、searchdデーモン(サービス)を再起動するだけでなく、「data」フォルダーにあるすべてのものを削除する必要があります(またはインデックスを保存した場所)!

于 2012-11-01T09:55:57.267 に答える