0

sphinx.conf

sql_query           = SELECT item_id, item_title, item_time, cat_id, region_id, region_parent, region1, region2, region3, metro_id, group_id, doc_words, FROM articles;

sql_attr_uint           = cat_id
sql_attr_uint           = region_id
sql_attr_uint           = region_parent
sql_attr_uint           = region1
sql_attr_uint           = region2
sql_attr_uint           = region3
sql_attr_uint           = metro_id
sql_attr_uint           = group_id
sql_attr_timestamp      = item_time

sql_query_info          = SELECT * FROM articles WHERE item_id=$id

PHP スフィンクス クライアント

$cl->SetMatchMode( SPH_SORT_EXTENDED  );

// User choses either full text search for title or doc_words column
if ($user_column_selected == "titles")  
{
    $user_selected_table = "@item_title";
}
elseif ($user_column_selected == "@doc_words")  
{
    $user_selected_table = "@doc_words";
}

// User chose to filter by metro_id
$metro_array = explode(",", $selected_market_type);
$cl->SetFilter('metro_id', $metro_array);

// User chose to filter by category
$cat_array = explode(",", $selected_category);
$cl->SetFilter('cat_id', $cat_array);

// User chose to filter by a range of region_id
if ($user_region_range == "1")
{
    $cl->SetFilterRange('region_id', 100, 152, TRUE);
}
else
{
    /**** USER SELECTED A SPECIFIC REGION ****/
    $region_array = explode(",", $selected_region);
    $cl->SetFilter('region_id', $region_array);
}

// User chose to sort by time rather than relevance
if ($user_relevance == "1")
{   
    // by item time
    $cl->SetSortMode(SPH_SORT_ATTR_DESC, 'item_time');
}

// User chose to filter by time range
if ($user_date_filter == "1")
{
    $cl->SetFilterRange('item_time',$unix_date_from, $unix_date_to,$exclude=false);
}

// User choses to group results by group_id
if ($user_group == "1")
{
    $cl->SetGroupBy ( 'group_id', SPH_GROUPBY_ATTR, '@group desc' );
}

$sphinx_result = $cl->Query($user_selected_table." ".$user_text_query, my_sphinx_index );

上記で作成したものを使用すると、ユーザーは item_title または doc_words で全文検索を実行でき、item_time で並べ替えて group_id でグループ化できる 1 つ以上の sql_attr_uint 列で結果を絞り込むことができます。

上記のように、現在、sql_attr_uint リージョン列のいずれかで setFilter を設定できますが、必要なのは、これらのリージョン列のブール OR です。

region_id、region_parent、region1、region2、region3の列に何らかの「setFilter OR」を追加しながら、上記の機能を失うことなくそうしたいと考えています。

ドキュメントで mysql CONCAT の例を使用して setSelect と setFilter を読みましたが、この種の構成に適用する場合は意味がありません。それを処理する最良の方法は何ですか?

4

1 に答える 1

0

個人的には、おそらくリージョンの新しい MVA を作成するでしょう

sql_query = ... cat_id, CONCAT_WS(',', region_id, region_parent, region1, region2, region3) AS regions, ...
sql_attr_multi = uint regions from field

次に、任意の列に特定のIDを持つドキュメントを見つけるのは非常に簡単です:-)

于 2013-10-26T13:19:02.830 に答える