Install-Package SoftCircuits.FullTextSearchQuery
FulltextSearchQuery-это библиотека классов .NET, которая преобразует удобный поисковый термин в действительный полнотекстовый запрос Microsoft SQL Server. Код пытается обнаружить и обрабатывать все случаи, когда запрос в противном случае приведет к созданию ошибки SQL Server.
Microsoft SQL Server предоставляет мощную полнотекстовую функцию поиска. Тем не менее, синтаксис довольно загадочный, особенно для непрограммистов. Более того, существует много условий, которые могут привести к тому, что SQL Server добавил ошибку, если что -то не так.
FulltextSearchQuery преобразует удобный пользовательский, Google-подобный поисковый термин в соответствующее полнотекстовое поиск SQL Condity. Его цель состоит в том, чтобы никогда не делать исключения из плохо сформированного ввода. Он просто строит лучший допустимый запрос, который он может с ввода.
В следующем списке показано, как преобразуется различные вводы.
| Вход | Выход | Описание |
|---|---|---|
| азбука | FORMSOF(INFLECTIONAL, abc) | Найдите инфляционные формы ABC. |
| ~ ABC | FORMSOF(THESAURUS, abc) | Найти тезаурус вариации ABC. |
| "ABC" | "abc" | Найдите точный термин ABC. |
| +ABC | "abc" | Найдите точный термин ABC. |
| "ABC" рядом "def" | "abc" NEAR "def" | Найдите точный термин ABC почти точный термин def. |
| ABC* | "abc*" | Находит слова, которые начинаются с ABC. |
| -ABC def | FORMSOF(INFLECTIONAL, def) AND NOT FORMSOF(INFLECTIONAL, abc) | Найти инфляционные формы DEF, но не инфлекционные формы ABC. |
| ABC def | FORMSOF(INFLECTIONAL, abc) AND FORMSOF(INFLECTIONAL, def) | Найти инфляционные формы как ABC, так и def. |
| ABC или DEF | FORMSOF(INFLECTIONAL, abc) OR FORMSOF(INFLECTIONAL, def) | Найдите инфляционные формы ABC или DEF. |
| < +abc +def> | "abc" NEAR "def" | Найдите точный термин ABC почти точный термин def. |
| ABC и (DEF или GHI) | FORMSOF(INFLECTIONAL, abc) AND (FORMSOF(INFLECTIONAL, def) OR FORMSOF(INFLECTIONAL, ghi)) | Найдите инфляционные формы как ABC, так и DEF или GHI. |
Даже после того, как был сгенерирован синтаксически правильный запрос, SQL Server все еще может генерировать ошибку для некоторых запросов. Например, в таблице выше вы можете видеть, что выход для -abc def обменивается двумя подгруппами. Это связано с тем, что NOT FORMSOF(INFLECTIONAL, abc) AND FORMSOF(INFLECTIONAL, def) вызовут ошибку. SQL Server не любит NOT в начале. В этом примере FulltextSearchQuery будет заменять две подэкспрессии (с обеих сторон AND ).
После построения запроса, FulltextSearchQuery проверит это и несколько других условий ошибки и внесет исправления по мере необходимости. В следующей таблице описываются эти условия.
| Срок | Действие принято |
|---|---|
| Не термин и термин2 | Подоспрессии поменялись. |
| Не термин1 | Выражение отброшено. |
| Не термин1, а не термин2 | Выражение выброшено, если узел сгруппируется (в скобках) или является корневым узлом; В противном случае родительский узел может содержать еще одну подэкспрессию, которая сделает это действительным. |
| Термин или нет термин2 | Выражение отброшено. |
| Термин 1 рядом с термином2 | Рядом союз изменился на и. |
FulltextSearchQuery преобразует все соединения в ближайшие соединения, и когда любая подэкспрессия не является внутренним нодом с формами формы.
Используйте метод Transform() для преобразования выражения поиска в действительное условие полнотекстового поиска SQL Server. Этот метод требует удобного поискового запроса и преобразует его в правильно сформированное условие полнотекстового поиска, которое можно передавать в SQL Server, CONTAINS или CONTAINSTABLE функции. Если запрос содержит недопустимые термины, код будет делать все возможное, чтобы вернуть действительное условие поиска. Если не было найдено допустимых терминов, этот метод возвращает пустую строку.
// Pass true to add the standard stop words
FtsQuery ftsQuery = new FtsQuery ( true ) ;
string searchTerm = ftsQuery . Transform ( text ) ; В следующем примере запроса SQL @SearchTerm - это ссылка на строку, возвращаемую из Transform() .
SELECT select_list
FROM table AS FT_TBL INNER JOIN
CONTAINSTABLE(table, column, @SearchTerm) AS KEY_TBL
ON FT_TBL . unique_key_column = KEY_TBL.[KEY];Одна вещь, о которой нужно знать, это обработка SQL Server Stop Words. Стоп слов - это такие слова, как А и , и . Эти слова не включены в полнотекстовый индекс. SQL Server не индексирует эти слова, потому что они очень распространены и не добавляют качество поиска. Поскольку эти слова не проиндексированы, SQL Server никогда не найдет соответствия для этих слов. Результатом является то, что поиск стоп -слова не вернет результатов, даже если это слово может появиться в статьях!
Лучший способ справиться с этим, кажется, - исключить эти слова из SQL -запроса. Легкий полный текстовый поиск позволяет сделать это, добавив Stop Words в свойство сбора StopWords . Стопсы не будут включены в полученный запрос, если они не будут цитированы, тем самым предотвращая остановские слова в запросе блокировать все результаты.
Самый простой способ добавить стандартный список остановленных слов в коллекцию StopWords - это передавать true конструктор FtsQuery . (Чтобы увидеть, какие слова были добавлены, вы можете просто осмотреть коллекцию StopWords .) Вы можете изменить коллекцию StopWords в любое время, по мере необходимости.
В качестве альтернативы, SQL Server предоставляет опцию для предотвращения проблемы, описанной выше. Опция «Transform Noise Words» можно использовать, чтобы позволить SQL Server возвращать совпадения, даже если запрос содержит стоп -слово (шум oom). Установите эту опцию на 1, чтобы включить преобразование слов шума. См. Опция конфигурации сервера Transform Noise Words для получения дополнительной информации.
Следующий запрос можно использовать для получения системы остановки системы из базы данных SQL Server.
SELECT ssw . stopword , slg . name
FROM sys . fulltext_system_stopwords ssw
JOIN sys . fulltext_languages slg
ON slg . lcid = ssw . language_id
WHERE slg . lcid = 1033Для получения дополнительной информации и обсуждения кода, пожалуйста, см. В моей статье простые полнотекстовые запросы поиска.