2

ライブ フォーム検索用に、ID、StreetNumber、StreetName、StreetType のフルテキスト インデックスを使用してテーブルをセットアップしました。サンプル データは次のようになります。

       ID        StreetNumber   StreetName   StreetType
   -----------------------------------------------------
   | 141099  |        1411   |  Elm       |      ST    |
   -----------------------------------------------------
   | 141100  |        2901   |  Maple     |      LN    |
   -----------------------------------------------------

次を使用してクエリを実行する場合:

SELECT ID, StreetName, StreetNumber, StreetType
FROM Locations
WHERE MATCH(ID, StreetName, StreetNumber, StreetType)
      AGAINST('1411*' IN BOOLEAN MODE)

もちろん、両方のレコードが返されます...しかし、どのフィールドに一致したかを簡単に判断する方法を見つけるのに苦労しています。

ライブ検索結果を次のような形式にフォーマットしたいと思います。

ID: 141100 (2901 Maple Lane)
Address: 1411 Elm St

...一致したもので並べ替えます。PHP でのフォーマットは簡単です。問題は、結果が一致したものを見つけることです。ただし、PHP で調べる必要がなければ、これを行う方法を見つけることができません (あまり効率的ではありません)。アイデア?

4

1 に答える 1

1

フルテキスト インデックスを使用して効率的に検索を実行し、別のソリューションを使用して選択リストの列をテストできます (これは、WHERE 句のフィルターを通過する行に対してのみ実行されます)。

SELECT ID, StreetName, StreetNumber, StreetType,
  (StreetName like '%1411%') AS `StreetName_matches`, 
  (StreetNumber like '%1411%') AS `StreetNumber_matches`,
  (StreetType like '%1411%') AS `StreetType_matches`
FROM Locations 
WHERE MATCH(ID, StreetName, StreetNumber, StreetType) 
      AGAINST('1411*' IN BOOLEAN MODE)

または、列に 4 つの個別のフルテキスト インデックスを作成し、それぞれを順番に検索することもできます。

SELECT ID, StreetName, StreetNumber, StreetType,
  MAX(`ID_Matches`) AS `ID_Matches`,
  MAX(`StreetName_Matches`) AS `StreetName_Matches`,
  MAX(`StreetNumber_Matches`) AS `StreetNumber_Matches`,
  MAX(`StreetType_Matches`) AS `StreetType_Matches`
FROM (
  SELECT SELECT ID, StreetName, StreetNumber, StreetType,
    1 AS `ID_Matches`,
    NULL AS `StreetName_Matches`,
    NULL AS `StreetNumber_Matches`,
    NULL AS `StreetType_Matches`
  FROM Locations 
  WHERE MATCH(ID) AGAINST('1411*' IN BOOLEAN MODE)
  UNION ALL
  SELECT SELECT ID, StreetName, StreetNumber, StreetType,
    NULL AS `ID_Matches`,
    1 AS `StreetName_Matches`,
    NULL AS `StreetNumber_Matches`,
    NULL AS `StreetType_Matches`,
  FROM Locations 
  WHERE MATCH(StreetName) AGAINST('1411*' IN BOOLEAN MODE)
  UNION ALL
  SELECT SELECT ID, StreetName, StreetNumber, StreetType,
    NULL AS `ID_Matches`,
    NULL AS `StreetName_Matches`,
    1 AS `StreetNumber_Matches`,
    NULL AS `StreetType_Matches`,
  FROM Locations 
  WHERE MATCH(StreetNumber) AGAINST('1411*' IN BOOLEAN MODE)
  UNION ALL
  SELECT SELECT ID, StreetName, StreetNumber, StreetType,
    NULL AS `ID_Matches`,
    NULL AS `StreetName_Matches`,
    NULL AS `StreetNumber_Matches`,
    1 AS `StreetType_Matches`,
  FROM Locations 
  WHERE MATCH(StreetTYPE) AGAINST('1411*' IN BOOLEAN MODE)
) AS t
GROUP BY t.ID;

また、 Sphinx SearchApache Solrなど、より完全な機能を備えた全文検索テクノロジを検討することもできます。

たとえば、Solr のクエリに一致する列を返す方法への回答を参照してください..?

于 2013-04-01T22:54:17.873 に答える