ASP.NET - Как правильно разделить строку для поиска? - PullRequest
0 голосов
/ 21 августа 2010

Я пытаюсь создать поиск, аналогичный поиску в Google (в отношении точного соответствия, заключенного в двойные кавычки).

Давайте использовать следующую фразу для примера

«поиск по фразе» отдельные термины [разные фразы]

В настоящее время, если я использую следующий код

        Dim searchTermsArray As String() = searchTerms.Split(New String() {" ", ",", ";"}, StringSplitOptions.RemoveEmptyEntries)

        For Each entry In searchTermsArray
            Response.Write(entry & "<br>")
        Next

, мой вывод

"фраза
поиск"
одиночный
термины
[разные
фраза]

но мне действительно нужно создать пару ключ-значение

phrase search     |  table1  
single            |  table1  
terms             |  table1  
different phrase  |  table2

, где table1 - это таблица с общей информацией, а table2 - это таблица «тегов», аналогичная той, что используется в stackoverflow.

Может кто-нибудь указать мне правильное направление, как правильно захватывать ввод

Ответы [ 5 ]

3 голосов
/ 21 августа 2010

То, что вы пытаетесь сделать, не так тривиально. Внедрение поиска, "похожего на Google", далеко не просто анализ строки поиска.

Я бы посоветовал вам не изобретать велосипед и вместо этого использовать готовые к работе решения, такие как Apache Lucene.NET или Apache Solr . Они справляются как с разбором, так и с полнотекстовым поиском.

Но если вам нужно только разобрать этот тип строк, вам следует подумать над решением, на которое указал Пит.

0 голосов
/ 21 августа 2010

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

Вместо этого есть три правильных способа справиться с этим:

  1. Используйте стороннее решение, такое как Lucene.
  2. Создайте грамматику через что-то вроде antlr.
  3. Создайте свой собственный конечный автомат.

Для проблемы такого уровня (и если предположить, что поиск достаточно важен для того, что вы делаете, чтобы действительно захотеть реализовать его самостоятельно), я бы, вероятно, выбрал вариант 3. Это имеет больше смысла, когда вы понимаете, что обычный выражения сами по себе являются инструкциями по настройке конечных автоматов. Все, что вы делаете, это встраиваете это прямо в ваш код. Это должно дать вам возможность настраивать производительность и функции, не требуя добавления большего компонента лексера в ваш код.

Для примера того, как вы можете это сделать, посмотрите на мой ответ на этот вопрос:
Чтение файлов CSV в C #
Я хотел бы создать конечный автомат для анализа строки символ за символом. Это будет самый простой способ реализовать полностью правильное решение, а также привести к быстрейшему коду.

0 голосов
/ 21 августа 2010

В зависимости от того, насколько вы планируете получать, вы можете рассмотреть грамматику / реализацию поиска, включенную в Irony.

http://irony.codeplex.com/

0 голосов
/ 21 августа 2010

Я бы пошел за регулярные выражения

  1. Отфильтровать все совпадения шаблона "\". + \ "" ("Поиск фразы")
  2. Отфильтровать все совпадения"[. +]" ([другой поиск])
  3. Разделить остаток на ""
0 голосов
/ 21 августа 2010

Regex твой друг.См этот вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...