Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Алексаша Member Откуда: Левый берег Сообщений: 412 |
Здравствуйте. MS SQL SERVER 2017 Имеется таблица с настроенным полнотекстовым поиском по некоторому столбцу. в этом столбце во многих записях имеется текст ... обустройство личных дел ... и ему подобных .... дел не могу понять почему запрос не возвращает результата select * from dbo.Table where contains (field, '"обустр*" and "лич*" and "дел*"') почему без слова "дел" есть результат а с "дел" нет результата ? |
6 фев 19, 18:45 [21802995] Ответить | Цитировать Сообщить модератору |
Ролг Хупин Member Откуда: Чебаркуль Сообщений: 3990 |
есть поле, где есть все три ? |
||
6 фев 19, 19:08 [21803009] Ответить | Цитировать Сообщить модератору |
Алексаша Member Откуда: Левый берег Сообщений: 412 |
Да, есть записи где все 3 слова. Чисто дел* находит как только добавишь ещё слово нет результата :( |
6 фев 19, 22:54 [21803119] Ответить | Цитировать Сообщить модератору |
Ролг Хупин Member Откуда: Чебаркуль Сообщений: 3990 |
приведите пример - какая запись не находится, а должна, по вашему мнению |
||
7 фев 19, 13:10 [21803442] Ответить | Цитировать Сообщить модератору |
Алексаша Member Откуда: Левый берег Сообщений: 412 |
Ролг Хупин, вот есть запись со значением в поле field = "РЗЧ, обустройство личных дел" при таких запросах не возвращает записи select * from dbo.Table where contains (field, '"обустр*" and "лич*" and "дел*"') select * from dbo.Table where contains (field, '"обустр*" and "лич*" and "де*"') а вот так возвращает select * from dbo.Table where contains (field, '"обустр*" and "лич*"') select * from dbo.Table where contains (field, '"обустр*" and "лич*" and "д*"') Блин ... В чем дело? |
10 апр 19, 09:42 [21857974] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8353 |
Алексаша, е нерусская? |
10 апр 19, 12:48 [21858191] Ответить | Цитировать Сообщить модератору |
Алексаша Member Откуда: Левый берег Сообщений: 412 |
Владислав Колосов, проверил. кириллическая |
10 апр 19, 13:30 [21858258] Ответить | Цитировать Сообщить модератору |
Ролг Хупин Member Откуда: Чебаркуль Сообщений: 3990 |
Проверил, все запросы находят,, правда поле сделал nvarchar на всякий случай, и запросы тоже типа select * from dbo.Table where contains (field,N '"обустр*" and "лич*" and "де*"') |
||
11 апр 19, 10:41 [21859035] Ответить | Цитировать Сообщить модератору |
uaggster Member Откуда: Сообщений: 960 |
А коллейшн какой? |
11 апр 19, 14:06 [21859446] Ответить | Цитировать Сообщить модератору |
dvk92 Member Откуда: Сообщений: 41 |
Зачем вам после слово дел - *? Оно же является последним в строке? |
11 апр 19, 14:38 [21859516] Ответить | Цитировать Сообщить модератору |
Алексаша Member Откуда: Левый берег Сообщений: 412 |
Нашел ответ на свой вопрос. В студии правой мышкой по таблице с полнотекстовым поиском Полнотекстовый индекс -> Свойства. Вкладка общие, свойство список стоп-слов полнотекстового индекса = системный. если поставить значение индекса = выкл. то все работает как надо только как следствие вырос размер индекса. решил посмотреть: SELECT * FROM sys.fulltext_system_stopwords ssw WHERE language_id = 1049; слово "дел" там присутствует как и другие (важная, вести) по которым у меня поиск не работал и предлоги. в итоге я в недоумении как правильно использовать список стоп-слов. получается перед запросом надо проверить не находится слово из раздела where в списке стоп-слов и если оно там есть то не использовать его. или как это предполагается использовать по-уму? ведь пользователь может ввести искомую фразу вместе с предлогом и в итоге из-за одного предлога "в" результат будет пуст |
15 май 19, 11:56 [21885119] Ответить | Цитировать Сообщить модератору |
Ролг Хупин Member Откуда: Чебаркуль Сообщений: 3990 |
В том-то и смысл шумных слов, что они будут игнорироваться при поиске. Если вы настроены отключить их, то готовьтесь к тому, что индекс будет намного больше, время поиска увеличится, а толку - почти 0. Для того и придумали стоп-слова, чтобы не искать несущественные, например, все цифры, артикли всякие и т.д. |
||
16 май 19, 08:37 [21885853] Ответить | Цитировать Сообщить модератору |
Алексаша Member Откуда: Левый берег Сообщений: 412 |
Ролг Хупин, Правильно ли я вас понял? Получается если от клиента на сервер пришло условие поиска, т.е. слова кот. должен содержать документ, то прежде чем делать выборку надо проверить не входит ли слово в перечень стоп-листа т.е. не выполнять такой запрос select * from dbo.Table where contains (field, '"обустройство" and "личных" and "дел"') а исключить слово "дел" select * from dbo.Table where contains (field, '"обустройство" and "личных"') В таком случае нужно проинформировать пользователя об исключении этого слова чтобы его не удивлял результат, который будет отличатся от ожидаемого. Что скажите? |
16 май 19, 15:56 [21886410] Ответить | Цитировать Сообщить модератору |
Ролг Хупин Member Откуда: Чебаркуль Сообщений: 3990 |
Как вы проверите? заметьте, что шумные слова могут тоже быть представлены в юзерской фразе в какой-то форме И что вы будете делать после того, как, предположим, проверите фразу и там будут стоп слова? Не стоит заниматься фигней, изобретая велоспипед. Почитайте для начала, что пишут здесь: https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/transform-noise-words-server-configuration-option?view=sql-server-2017 |
||
17 май 19, 12:17 [21887111] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |