を検索するための推奨方法私は、次の内容を持つテーブルがある:階層データMSSQL2008
- 区分
- のParentID
- 名前
私はそれだろう検索機能を持っていると思いますたとえば階層全体を検索すると、これはカテゴリのブレッドクラムです。
オートバイ/ J APAN/KAWASAKI/600cc〜800cc/1998-2004
「600cc川崎」を検索した場合は、上記のカテゴリを返信してください。したがって、最も一致するカテゴリパスが返されます。
瞬間に私はこの思い付いた:
IF ISNULL(@searchTerm, '') = ''
SET @searchTerm = '""'
DECLARE @Result TABLE (CategoryId int)
DECLARE CategoryCursor CURSOR LOCAL FAST_FORWARD FOR
SELECT CategoryId, ParentId, Name
FROM Category
WHERE FREETEXT([Name], @searchTerm)
OPEN CategoryCursor
DECLARE @CategoryId int
DECLARE @ParentId int
DECLARE @Name nvarchar(100)
FETCH NEXT FROM CategoryCursor INTO @CategoryId, @ParentId, @Name
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @FullPath nvarchar(1000)
SET @FullPath = @Name
WHILE @ParentId <> 0
BEGIN
SELECT @ParentId = ParentId, @Name = [Name]
FROM Category
WHERE CategoryId = @ParentId
SET @FullPath = @Name + '\' + @FullPath
END
-- Check if @FullPath contains all of the searchterms
DECLARE @found bit
DECLARE @searchWords NVARCHAR(100)
DECLARE @searchText NVARCHAR(255)
DECLARE @pos int
SET @found = 1
SET @searchWords = @searchTerm + ' '
SET @pos = CHARINDEX(' ', @searchWords)
WHILE @pos <> 0
BEGIN
SET @searchText = LEFT(@searchWords, @pos - 1)
SET @searchWords = STUFF(@searchWords, 1, @pos, '')
SET @pos = CHARINDEX(' ', @searchWords)
IF @searchText = '' CONTINUE
IF @FullPath NOT LIKE '%' + @searchText + '%'
BEGIN
SET @found = 0
BREAK
END
END
IF @found = 1
INSERT INTO @Result VALUES(@CategoryId)
FETCH NEXT FROM CategoryCursor INTO @CategoryId, @ParentId, @Name
END
CLOSE CategoryCursor
DEALLOCATE CategoryCursor
SELECT *
FROM Category
WHERE categoryID IN (SELECT categoryId FROM @Result)
これは最初のsearchwordsのいずれかを含むすべてのcatagorynamesを検索します。問題は、私は他のブランドが "川崎"に関連するものだけを返すように "600cc"を望んでいないということです。 次に、現在のカテゴリのブレッドクラムを作成し、すべての検索語が含まれているかどうかを確認します。
それは機能しますが、私はそれが効果がないと思うので、私はより良い方法を探しています。
おそらく、完全なパスをテキストとして新しい列に格納し、それを検索しますか?
多くの有用な参考文献がここにある[1]。 [1]:http://stackoverflow.com/questions/4048151/what-are-the-options-for-storing-hierarchical-data-in-a-relational-database非常に便利になります – TMS