3

文字列がこのテーブルの多くのテキスト列の 1 つ以上に一致するレコードを返す高度な検索機能を作成しています。

何かのようなもの:

select * from some_table where (txt_1 like '%foo%') or (txt_2 like '%foo%') or...

または:

select * from some_table where match (txt_1, txt_2, ...) against ('foo')

全文検索ができるかどうか(まだわかりません)。

私の問題は、どの列が実際に「foo」と一致したかをどのように知ることができるかということです。

たとえば、次のレコードがあるとします。

id  txt_1  txt_2  txt_3  txt_4
1   'foo'  'bar'  'bar'  'foo'
2   'bar'  'bar'  'bar'  'bar'
3   'bar'  'foo'  'bar'  'bar'
4   'bar'  'bar'  'bar'  'bar'

私のクエリは次のようなものを返す必要があります:

id  txt_1_matches  txt_2_matches  txt_3_matches  txt_4_matches
1   1              0              0              1
3   0              1              0              0

単純なクエリ結果の後処理でこれを行うことができますが、避けたいと思います。これを行うクリーンで簡単な方法はありますか?

乾杯

4

2 に答える 2

2

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

select (txt_1 like '%foo%') as `txt1_matches`, 
       (txt_2 like '%foo%') as `txt2_matches`, ...
from some_table where match (txt_1, txt_2, ...) against ('foo')

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

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

于 2013-03-19T01:44:17.790 に答える
2

あなたはこれを行うことができます:

SELECT * FROM
  (SELECT id,
          txt_1 LIKE '%foo%' AS a,
          txt_2 LIKE '%foo%' AS b,
          txt_3 LIKE '%foo%' AS c,
          txt_4 LIKE '%foo%' AS d
   FROM some_table) AS q
WHERE a OR b OR c OR d;

サブクエリに入れたことに注意してください。MySQLでこれを行う必要があるか、列「a」が存在しないなどと不平を言います...

于 2013-03-19T01:45:12.087 に答える