2008-08-17 5 views
5

Я пытаюсь найти простой способ разобрать поисковый запрос и преобразовать его в SQL-запрос для моей БД.Анализ поисковых запросов в Java

Я нашел два решения:

  1. Lucene: Мощные Java на основе поисковой системы, содержит анализатор запросов, но это не очень хорошо настраивается и я мог бы найти способ легко взломать/адаптировать его для создания SQL-запросов.
  2. ANTLR: Ветренный текстовый лексер-парсер. Используется для создания чего-либо от компиляторов до скребков. ANTLR является очень настраиваемым, но всем, касающимся кода, теперь нужно будет изучить новый язык ...

Другие идеи?

ответ

0

Зависит от типа запросов, которые вы должны проанализировать, и несколько о структуре данных в вашей базе данных. Я предполагаю, что вы не пытаетесь выполнять полнотекстовый поиск в БД (т. Е. Поисковой системе по всей вашей БД), потому что, поскольку большинство людей, ищущих информацию, скажут вам, производительность для этого ужасная. Инвертированные индексы - это, безусловно, лучший способ сделать это.

Сообщите нам немного больше о фактической проблеме: какие пользователи будут вводить, что они ожидают как выходные данные, и какова модель данных. Создайте поисковое решение без этих фрагментов информации, и вы получите далеко не оптимальный результат.

1

Что именно вы имеете в виду? Я использовал Lucene для текстового поиска, но там, где он выделяется, строит индекс и ищет то, что вместо бьет по базе данных вообще.

Недавно я установил систему, в которой я индексирую таблицу в Lucene, объединяя все столбцы (разделенные пробелами) в одно поле и добавляя их в Lucene, а затем добавляя первичный ключ в отдельный столбец. Lucene выполняет весь поиск и возвращает список первичных ключей, которые я использовал, чтобы вытащить заполненный набор результатов и отобразить пользователю.

Преобразование поискового запроса в SQL-запрос показалось бы мне немного беспорядочным.

Также, здесь a great beginning tutorial explaining the basic structure of Lucene.

0

Вы правы, считая, что я не ищу полнотекстовый поиск. информации выглядит как эта схема для информации о книге: Имени: строка, издатель: строка, NUM_PAGES междунар, PUBLISH_DATE: дата ...

поисковых запросов являются сорта:

  1. Гарри Поттер (поиск любых книг Whos названия Гарри и Поттер)
  2. издатель: Природа * страницы> 100 (книги от издателя, начиная с природой с более чем 100 книг)
  3. («Новые годы» или Рождество) и подарок (вы получаете изображение ...)
  4. физика и публикующие> 1/1/2008 (новая физика книг)
1

Вы можете попробовать использовать что-то вроде javacc (Java Compiler Compiler) осуществлять синтаксический анализатор, или просто вручную разобрать строку, грубая сила. Каждый раз, когда вы сталкиваетесь с выражением, вы представляете его как объект. Тогда вам просто нужно перевести дерево выражений в предложение where.

Например: "Гарри Поттер" становится

new AndExp(new FieldContainsExp("NAME", "Harry"), new FieldContainsExp("NAME", "Potter") 

И "Издатель: Природа * страницы> 100" становится

new AndExp(new FieldContainsExp("PUBLISHER", "Nature"), FieldGreaterThan("PAGES", 100)) 

Затем, когда у вас есть эти, это довольно легко превратить их на SQL:

FieldContainsExp.toSQL(StringBuffer sql, Collection<Object> args) { 
    sql.append(fieldName); 
    sql.append(" like "); 
    sql.append("'%?%'"); 
    args.add(value); 
} 

AndExp.toSQL(StringBuffer sql, Collection<Object> args) { 
    exp1.toSQL(sql, args); 
    sql.append(" AND "); 
    exp2.toSQL(sql, args); 
} 

Вы можете представить себе все остальное. Вы можете вложить и выражения так же глубоко, как вы хотите.

3

SQL-ORM очень легкая библиотека Java, которая включает в себя возможность построить (динамический) SQL запрос в Java в виде графа объектов

ИМХО, это гораздо лучше, метод для построения динамических запросов SQL, чем обычно Метод конкатенации строк.

Отказ от ответственности: Я сделал некоторые самые незначительные вклад в этот проект

+0

Очень интересно. Кажется, что IBatis без отображения и материала XML – 2008-10-02 03:40:27

0

Пытаться совместить инструмент ORM (как OpenJPA) и компас (рамки для Osem). Он автоматически индексирует обновления, сделанные с помощью инструментов ORM, и дает вам мощность Lucene для поиска. После этого вы можете, конечно, извлечь объект из БД. Он выводит любое поисковое решение на основе SQL.

-2

String [] array;

int checkWord(String searchWord) 
{ 
    for(int i = 0; i < array.length; i++) 
    { 
     if(searchWord.equals(array[i])) 
      return i; 
    } 
    return 0; 

} 
+0

Это не отвечает на вопрос. – 2013-09-27 13:02:22

Смежные вопросы