12

私は現在、SQL Server データベースがあるアプリケーションに取り組んでおり、人の名前を検索できる全文検索を機能させる必要があります。

現在、ユーザーは 3 つの異なる varchar 列を検索する名前フィールドに a を入力できます。名、姓、ミドルネーム

したがって、次の情報を含む 3 つの行があるとします。

1 - フィリップ - J - フライ

2 - エイミー - ヌル - ウォン

3 - レオ - ヌル - ウォン

ユーザーが「Fry」などの名前を入力すると、行 1 が返されます。ただし、Phillip Fry、Fr、または Phil と入力すると、何も取得されません..そして、なぜこれを行っているのかわかりません。Wong を検索すると、行 2 と 3 が得られ、Amy Wong を検索しても何も得られません。

現在、クエリは CONTAINSTABLE を使用していますが、結果に目立った違いはなく、FREETEXTTABLE、CONTAINS、および FREETEXT に切り替えました。テーブル メソッドは同じ結果を返しますが、ランキングを伴うため、優先されます。

これがクエリです。

....
@Name nvarchar(100),
....
--""s added to prevent crash if searching on more then one word.
DECLARE @SearchString varchar(100)
SET @SearchString = '"'+@Name+'"'
SELECT Per.Lastname, Per.Firstname, Per.MiddleName
FROM Person as Per
INNER JOIN CONTAINSTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 
AS KEYTBL
ON Per.Person_ID = KEYTBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEYTBL.RANK DESC;  
....

何か案は...?この全文検索が正しく機能しないのはなぜですか?

4

5 に答える 5

4

FreeTextTable が機能するはずです。

INNER JOIN FREETEXTTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 

@SearchString には、'Phillip Fry' (スペースで区切られたすべてのルックアップ文字列を含む 1 つの長い文字列) のような値が含まれている必要があります。

Fr または Phil を検索する場合は、アスタリスクを使用する必要があります: Phil* および Fr*

'Phil' は正確に 'Phil' という単語を探しています。「Phil*」は、「Phil」で始まるすべての単語を検索します

于 2008-08-20T14:14:24.170 に答える
4

人の名前を検索するだけの場合は、全文索引を使用しない方が得策かもしれません。フルテキスト インデックスは、大きなテキスト フィールドがある場合には理にかなっていますが、ほとんどの場合、フィールドごとに 1 つの単語を扱う場合、フルテキスト インデックスからどれだけ多くの情報が得られるかわかりません。新しいレコードを検索する前に全文索引が再索引付けされるのを待つことは、多くの問題の 1 つです。

次のようなクエリを作成できます。検索文字列をスペースで分割し、検索語のリストを作成します。

名、ミドルネーム、姓を選択
人から
どこ
@searchterm1 + '%' のようなファーストネーム
または @searchterm1 + '%' のようなミドルネーム
または @searchterm1 + '%' のような LastName
または @searchterm2 + '%' のような名前
等....
于 2008-08-20T14:25:57.700 に答える
3

応答してくれてありがとう、私はついにそれを機能させることができました。Biri と Kibbee の両方の回答の一部です。機能させるには、文字列に * を追加し、スペースで分割する必要がありました。だから結局私は得た

....
@Name nvarchar(100),
....
--""s added to prevent crash if searching on more then one word.
DECLARE @SearchString varchar(100)

--Added this line
SET @SearchString = REPLACE(@Name, ' ', '*" OR "*')
SET @SearchString = '"*'+@SearchString+'*"'

SELECT Per.Lastname, Per.Firstname, Per.MiddleName
FROM Person as Per
INNER JOIN CONTAINSTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 
AS KEYTBL
ON Per.Person_ID = KEYTBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEYTBL.RANK DESC;  
....

質問のために単純化しただけで検索されるフィールドがさらにあります。申し訳ありませんが、それが答えに影響するとは思いませんでした。実際には、ニックネームの csv とメモ列を持つ列も検索します。

助けてくれてありがとう。

于 2008-08-20T15:28:21.450 に答える
2

Full Text の代わりにLucene.netをチェックしてみてください。

于 2008-08-20T16:27:25.147 に答える
2

別のアプローチは、個々のフィールドから検索を抽象化することです。

つまり、firstname lastname などのすべての分割フィールドを連結フィールド、つまり full_name に変換するデータのビューを作成します。

次に、ビューを検索します。これにより、検索クエリがより簡単になる可能性があります。

于 2008-08-20T14:51:03.147 に答える