1

私は Java (Eclipse) で検索エンジンの実装を行っていtbl_indexます。keyWordurl

複数の単語で構成される検索用語がある場合、すべての単語を含むすべての URL を検索するクエリを作成するにはどうすればよいでしょうか。

テーブル情報:

列 1 :keyWord (nvarchar(50))

列 2 :url (varchar(800))

これら 2 つはまとめてテーブルの主キーです。タルベ構造を変更する必要がない方法を提案してください。私の現在のスキーマの間違いを指摘することは役に立ちますが。

また、ウェブサイトの html から取得したキーワード (列keyWord) をインデックス化するための優れたインデックス作成手法を提案してください。

4

2 に答える 2

1

これを試して:

select distinct
  url 
from 
  tbl_index a 
where 
  (select count(*) from tbl_index b where a.url=b.url and b.keyword in ('word 1', 'word 2' . . .)) = n

n検索するキーワードの数で、「単語 1」、「単語 2」などはキーワードです。

3 つのテーブルを作成することをお勧めします。1 つは一意の URL ごとに 1 つの行があり、数値 ID と URL 名があり、2 つ目のテーブルは一意のキーワードごとに 1 つの行があり、数値 ID とキーワードがあり、相互参照テーブルがあります。すべてのペア url id - キーワード id:

create table urls (
  url_id int identity,
  url varchar(800),
  primary key (url_id)
)

create table keywords (
  keyword_id int identity,
  keyword nvarchar(50),
  primary key (keyword_id)
)

create table urlkeys (
  url_id int,
  keyword_id int,
  primary key (url_id, keyword_id)
)

このようにして、データのサイズを縮小する必要があります。上記のクエリは次のようになります。

select 
  url
from
  urls
where (select count(*) from urlkeys join keywords on urlkeys.keyword_id=keywords.keyword_id where urlkeys.url_id=urls.url_id and keywords.keyword in ('word 1', 'word 2' . . .)) = n

keyword列にインデックスを付けることをお勧めします

PSこれは単純化されたSQLソリューションの概要ですが、さまざまな人がコメントですでに指摘しているように、これは全文検索ソリューションを使用して解決するのが最善の問題です. ステミング、近接検索、部分単語検索、ワイルドカードなどを実行しようとするとすぐに、SQL ベースのソリューションは不十分になります。

于 2012-06-01T21:17:45.517 に答える
0

これは基本的に 2 ステップのプロセスになります。

A. まず、検索用語を次のように単語に分割します。

String[] words = searchTerm.split("\\W+");

B.次に、単語配列を反復処理してクエリを作成し、次のようなクエリを作成します。

Select url from tbl_index where keyword in ('word1', 'word2', 'word3');

ここで、word1、word2、word3 は基本的にwords[0], words[1], words[2]等です。

PS:テーブル内のキーワードを完全に一致させたくない場合があります。その場合rlike、正規表現機能のために MySQL クエリで句を使用することをお勧めします。

于 2012-06-01T21:04:06.430 に答える