Полнотекстовый каталог не может найти первичный ключ - PullRequest
1 голос
/ 28 сентября 2011

Я создал этот маленький образец Table Person.

enter image description here

Идентификатор является первичным ключом и является тождественным = True

Теперь, когда я пытаюсь создатьполнотекстового каталога, я не могу найти идентификатор.

enter image description here

Если я буду следовать этому мастеру, я получу каталог, в котором его можно будет найти толькодля имени человека.Я действительно хотел бы знать, как я могу сделать возможным полнотекстовый поиск как Id, так и Имени.

edit

enter image description here

SELECT *
FROM [TestDB].[dbo].[Person]
WHERE FREETEXT (*, 'anders' );

SELECT *
FROM [TestDB].[dbo].[Person]
WHERE FREETEXT (*, '1' );

Я хотел бы, чтобы они возвращали тот же результат, первый возвращает id = 1 name = Anders, а второй запрос ничего не возвращает.

edit 2

Похоже, проблема виспользуя int , но нельзя ли обмануть FullText для его поддержки?

edit 3

Создал представление, в котором я преобразую int в nvarchar.CONVERT(nvarchar(50), Id) AS PersonId это позволило мне выбрать этот столбец при создании полнотекстового каталога, но все равно не позволит мне найти его в поиске идентификатора.

Ответы [ 2 ]

2 голосов
/ 29 сентября 2011

Читая ваш вопрос, я не уверен, что вы понимаете цель полнотекстового индекса. Полнотекстовый индекс предназначен для поиска текста (один или несколько столбцов) в таблице. И не только в качестве замены:

SELECT *
FROM table
WHERE col1 LIKE 'Bob''s Pizzaria%'
OR col2 LIKE 'Bob''s Pizzaria%'
OR col3 LIKE 'Bob''s Pizzaria%'

Это также позволяет вам искать варианты "Bob's Pizzaria", такие как "Bobs Pizz e ria" (на тот случай, если кто-то опишет пиццерию или забыл вставить 'или чрезмерно усердный анти-SQL- Внедренный код лишил ') или "Robert's Pizza" или "Bob's Pizzeria" или "Bob's Pizza" и т. д. Он также позволяет выполнять поиск "в середине" текстового столбца (char, varchar, nchar, nvarchar и т. д. ) без страшного "% Bob% Pizza%", который исключает любую возможность использования традиционного индекса.

Достаточно с лекцией, однако. Чтобы ответить на ваш конкретный вопрос, я бы создал отдельный столбец (не «вычисляемый столбец») «IdText varchar (10)», а затем триггер AFTER INSERT что-то вроде этого:

UPDATE t
SET IdText = CAST(Id AS varchar(10))
FROM table AS t
INNER JOIN inserted i ON i.Id = t.Id

Если вы не знаете, что такое «вставлено», см. Эту статью MSDN или выполните поиск переполнения стека для «вставлен триггер». Затем вы можете включить столбец IdText в свой полнотекстовый индекс.

Опять же, из вашего примера я не уверен, что полнотекстовый индекс - это то, что вы должны использовать здесь, но опять же ваша реальная ситуация может быть чем-то другим, и вы только что создали этот пример для вопроса. Кроме того, полнотекстовые индексы являются относительно «дорогими», поэтому обязательно проведите анализ затрат и выгод. Вот вопрос переполнения стека вопрос об использовании полнотекстового индекса.

1 голос
/ 29 сентября 2011

Почему бы просто не сделать такой запрос?

SELECT *
FROM [TestDB].[dbo].[Person]
WHERE FREETEXT (*, '1' )
OR ID = 1

Вы можете не указывать часть «ИЛИ = 1», если сначала проверите, является ли поисковый запрос числом.

...