1

私はSphinxを使用しており、文字列の並べ替えを実装したいと考えています。これは属性と文字列序数を使用して実現できることは理解していますが、ライブ インデックス更新も実装したいと考えており、文字列序数は複数のインデックスでは機能しません。

複数のインデックスで文字列の並べ替えを近似する最良の方法は何ですか? たとえば、文字列の最初の数文字から整数を生成する方法を考えています。

select concat(ord('t'),ord('e'),ord('s'));

文字列 'test' の最初の 3 文字を整数属性に追加できます (MySQL では文字列ですが、sphinx に整数として追加されると仮定します)。これでおおよその並べ替えができますが、おそらくこれで十分です。

4

3 に答える 3

3

最終的に、文字列を序数に変換する MySQL 関数を作成しました。

CREATE DEFINER=`root`@`localhost` 
    FUNCTION `stringToOrd`(str varchar(100)) RETURNS int(11)
READS SQL DATA
DETERMINISTIC
SQL SECURITY INVOKER
BEGIN

    DECLARE ordinal INT;
    SELECT ((ORD(SUBSTRING(str,1,1)) * 16777216) 
        + (ORD(SUBSTRING(str,2,1)) * 65536)
        + (ORD(SUBSTRING(str,3,1)) * 256) + (ORD(SUBSTRING(str,4,1)))) 
        into ordinal;
    return ordinal;
END 

この関数は文字列の最初の 4 文字のみを使用するため、並べ替えは概算になります。この関数は、sphinx のインデックス作成クエリ中に (sphinx 構成ファイルで) 呼び出されます。この属性は、sphinx 検索呼び出し中の並べ替えに使用されます。

これは、本番環境で 6 か月以上正常に機能しています。

于 2009-12-30T20:27:14.663 に答える
1

ジョンストジョンの答えは私を大いに助けてくれました! 私は彼のコードを使用しましたが、UDF にはしませんでした。また、すべての文字列を大文字に変換したので、アルファベット順に並べ替えてもおかしくなりません。

したがって、次のようになります。

(..)

sql_query =

選択する \

ID \

名前 \

((ORD(SUBSTRING(UPPER(名前),1,1)) * 16777216) \

  • (ORD(SUBSTRING(UPPER(名前),2,1)) * 65536) \

  • (ORD(SUBSTRING(UPPER(名前),3,1)) * 256) \

  • (ORD(SUBSTRING(UPPER(name),4,1)))) name_ordとして\

から \

マイテーブル

sql_attr_uint = name_ord

(..)

メインインデックスとデルタインデックスの両方。

于 2011-10-20T15:31:45.577 に答える
0

たとえば、ord('&') は 38 で、ord('a') は 97 であるため、単語が [az][AZ] の場合は問題ありませんが、h&b のようなものがある場合は、たとえばハブの前になります。

マンフレッド

于 2009-03-24T14:33:36.147 に答える