2009-06-02 6 views
4

Я пытаюсь использовать полнотекстовый поиск по серии имен в моей базе данных. Это моя первая попытка использования полнотекстового поиска. В настоящее время я беру введенную строку поиска и устанавливаю условие NEAR между каждым термином (т. Е. Введенная фраза «Короли Леона» становится «Королями NEAR из NEAR Leon»).Noise Words in Sql Server 2005 Полнотекстовый поиск

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

Мой коллега предлагает взять все шумовые слова, как определено в MSSQL \ FTData \ noiseENG.txt, и поместить их в код .Net, чтобы шумовые слова могли быть удалены до того, как будет выполнен полнотекстовый поиск.

Это лучшее решение? Нет ли какой-либо опции автоматической магии, которую я могу изменить на SQL-сервере, чтобы сделать это для меня? Или, может быть, просто лучшее решение, которое не кажется хриплым?

+0

В предыдущем проекте мы использовали поиск по SQL Server Full Text и удалили шумовые слова с помощью C#. – Kane

ответ

4

Полный текст будет работать вне критериев поиска, которые вы предоставляете. Вы можете удалить шумовое слово из файла, но вы действительно рискуете раздувать ваш размер индекса, делая это. Роберт Кейн имеет много полезной информации на своем блоге по поводу этого:

http://arcanecode.com/2008/05/29/creating-and-customizing-noise-words-in-sql-server-2005-full-text-search/

Чтобы сэкономить время, вы можете посмотреть, как этот метод удаляет их и скопировать код и слова:

 public string PrepSearchString(string sOriginalQuery) 
    { 
     string strNoiseWords = @" 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | $ | ! | @ | # | $ | % |^| & | * | (|) | - | _ | + | = | [ | ] | { | } | about | after | all | also | an | and | another | any | are | as | at | be | because | been | before | being | between | both | but | by | came | can | come | could | did | do | does | each | else | for | from | get | got | has | had | he | have | her | here | him | himself | his | how | if | in | into | is | it | its | just | like | make | many | me | might | more | most | much | must | my | never | now | of | on | only | or | other | our | out | over | re | said | same | see | should | since | so | some | still | such | take | than | that | the | their | them | then | there | these | they | this | those | through | to | too | under | up | use | very | want | was | way | we | well | were | what | when | where | which | while | who | will | with | would | you | your | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z "; 

     string[] arrNoiseWord = strNoiseWords.Split("|".ToCharArray()); 

     foreach (string noiseword in arrNoiseWord) 
     { 
      sOriginalQuery = sOriginalQuery.Replace(noiseword, " "); 
     } 
     sOriginalQuery = sOriginalQuery.Replace(" ", " "); 
     return sOriginalQuery.Trim(); 
    } 

однако, я бы, вероятно, пошел с Regex.Replace для этого, который должен быть намного быстрее, чем цикл. У меня просто нет быстрого сообщения.

+1

После того, как вы добавите следующую строку в начало вашего метода, она работает правильно: sOriginalQuery = "" + sOriginalQuery + ""; Это необходимо для согласования слов шума, которые являются первым или последним словом поисковой фразы. –

0

Вот работающая функция. Файл noiseENU.txt копируется как -от от \Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\FTData.

Public Function StripNoiseWords(ByVal s As String) As String 
     Dim NoiseWords As String = ReadFile("/Standard/Core/Config/noiseENU.txt").Trim 
     Dim NoiseWordsRegex As String = Regex.Replace(NoiseWords, "\s+", "|") ' about|after|all|also etc. 
     NoiseWordsRegex = String.Format("\s?\b(?:{0})\b\s?", NoiseWordsRegex) 
     Dim Result As String = Regex.Replace(s, NoiseWordsRegex, " ", RegexOptions.IgnoreCase) ' replace each noise word with a space 
     Result = Regex.Replace(Result, "\s+", " ") ' eliminate any multiple spaces 
     Return Result 
    End Function 
Смежные вопросы