2

多くの記事では、mysql 検索の簡単な解決策としてフルテキスト インデックス作成を紹介しています。これは、適切な状況下では非常によくあることですが、フルテキストを使用できない場合 (たとえば、テーブル全体) にフルテキストに近いソリューションをまだ見ていません。私が探している解決策は、文中のあらゆるものに一致するものであることが望ましいです。

したがって、検索James Woodsまたは検索Woods Jamesの両方で、テキストJames Woodsが存在する同じ行が返される可能性があります。基本的な検索方法では、検索語の「ミックス マッチング」は役に立たなくなります。

REGEXP考えられる答えは、 Fulltext をorに置き換えることLIKEです。|次に、検索用語の「空白」をorに置き換えると、 との任意の組み合わせで結果が返さ%James Woodsます。または、'%James%Woods%' になり、生産性は低下しますが、それでも.James|WoodsJamesWoodsaren't necessarily exact

SQL の例

SELECT * FROM people
  LEFT JOIN 
   (SELECT GROUP_CONCAT(other_data) AS people_data GROUP BY people_id) 
   AS t2 ON(t2.people_id = people.id)
WHERE CONCAT_WS(' ', people.firstname, people.lastname, people_data) LIKE {$query}

これは本当に最善の方法ですか?このメソッド (または別のメソッド) をより効率的に機能させるための秘訣はありますか? 私は本当にmysqlソリューションを探しているので、あなたの答えが別のDBサービスを使用することである場合は、それでいいので、それを答えとして受け入れますが、本当の質問はmysqlの最適なソリューションです. ありがとう。

4

2 に答える 2

0

MySQLで使用してみましたか

MATCH() と AGAINST() 関数の組み合わせ

彼らはあなたが探している結果をもたらすでしょう。

例えば

次のデータセット::

mysql> select * from temp;
+----+---------------------------------------------+
| id | string                                      |
+----+---------------------------------------------+
|  1 | James Wood is the matyr.                    |
|  2 | Wood James is the saviour.                  |
|  3 | James thames are rhyming words.             |
|  4 | Wood is a natural product.                  |
|  5 | Don't you worry child - Swedish House Mafia |
+----+---------------------------------------------+
5 rows in set (0.00 sec)

james または wood のいずれかが存在する必要がある場合、このクエリは次の結果を返します。

mysql>  select string from temp where match (string) against ('james wood' in bo
olean mode);
+---------------------------------+
| string                          |
+---------------------------------+
| James Wood is the matyr.        |
| Wood James is the saviour.      |
| James thames are rhyming words. |
| Wood is a natural product.      |
+---------------------------------+
4 rows in set (0.00 sec)

James と Wood の両方の単語が存在する必要がある場合、このクエリは機能しません。単語の前の「+」記号に注意してください。このブールモードを確認してください

mysql> select string from temp where match (string) against ('+james +wood' in b
oolean mode);
+----------------------------+
| string                     |
+----------------------------+
| James Wood is the matyr.   |
| Wood James is the saviour. |
+----------------------------+
2 rows in set (0.00 sec)

任意の接尾辞を持つ単語を検索するには、同様の方法で機能します

mysql> select string from temp where match (string) against ('Jame*' in boolean
mode);
+---------------------------------+
| string                          |
+---------------------------------+
| James Wood is the matyr.        |
| Wood James is the saviour.      |
| James thames are rhyming words. |
+---------------------------------+
3 rows in set (0.02 sec)

ただし、Mysql による全文検索では、プレフィックス検索はまだサポートされていないことに注意してください。

mysql> select string from temp where match (string) against ('*ame*' in boolean
mode);
Empty set (0.00 sec)

これが役立つことを願っています。

親切なことに、この返信は非常に遅れていますが、返信するのに十分なほど興味がありました.

詳細については、このリンクを確認してくださいhttp://dev.mysql.com/doc/refman/5.5/en//fulltext-search.html

于 2013-03-21T17:32:04.623 に答える