web-dev-qa-db-ja.com

部分一致を検索するSQLクエリを作成するにはどうすればよいですか?

私はdbに一連のアイテムを持っています。各itemにはname and a description._search機能を実装する必要があります。これは、いくつかのキーワードを取得し、orの説明にある単語に一致するキーワードの少なくとも1つを含む個別のアイテムを返します。

たとえば、私はdbに3つのアイテムを持っています

1.item1 : 
    name : magic marker
    description: a writing device which makes erasable marks    on whiteboard

2.item2:
    name: pall mall cigarettes
    description: cigarette named after a street in london

3.item3:
    name: XPigment Liner
    description: for writing and drawing

キーワード「writing」を使用して検索すると、マジックマーカーとXPigment Linerが返されます

キーワード「モール」を使用して検索すると、2番目のアイテムが返されます

LIKEキーワードとINキーワードを別々に使用してみましたが、.. INキーワードを機能させるには、クエリを次のようにする必要があります

SELECT DISTINCT FROM mytable WHERE name IN ('pall mall cigarettes')

だが

SELECT DISTINCT FROM mytable WHERE name IN ('mall')

0行を返します

名前と説明の両方の列に対応し、Wordの部分一致を可能にするクエリを作成する方法を理解できませんでした。

誰か助けてもらえますか?

更新:

Hibernateを使用してテーブルを作成し、説明フィールドにjavax.persistence @Lobアノテーションを使用しました。テーブルを調べたときにpsqlを使用すると、それが表示されます

...
 id           | bigint                      | not null
 description  | text                        |  
 name         | character varying(255)      | 
...

テーブルのレコードの1つは、

id | description | name 
21 | 133414      | magic marker
9
Damon Julian

まず第一に、このアプローチは規模が大きくなることはなく、単語からアイテムへの個別のインデックスが必要になります(逆インデックスなど)。

データが大きくない場合は、

SELECT DISTINCT(name) FROM mytable WHERE name LIKE '%mall%' OR description LIKE '%mall%'

複数のキーワードがある場合は、ORを使用します。

23
stracktracer

これもうまくいくかもしれません。

SELECT * 
FROM myTable
WHERE CHARINDEX('mall', name) > 0
  OR CHARINDEX('mall', description) > 0
5
Narnian