Разбор поисковых запросов в Java

голоса
5

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

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

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

Любые другие идеи?

Задан 17/08/2008 в 20:21
источник пользователем
На других языках...                            


7 ответов

голоса
3

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

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

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

Ответил 30/09/2008 в 21:09
источник пользователем

голоса
1

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

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

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);
}

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

Ответил 30/09/2008 в 20:43
источник пользователем

голоса
1

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

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

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

Кроме того , здесь отличный учебник начинает объяснять базовую структуру Lucene .

Ответил 17/08/2008 в 20:30
источник пользователем

голоса
0

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

Ответил 18/08/2009 в 18:50
источник пользователем

голоса
0

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

Запросы, имеют порядок:

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

голоса
0

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

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

Ответил 17/08/2008 в 20:28
источник пользователем

голоса
-2

Строка [] массив;

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

}
Ответил 27/09/2013 в 13:45
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more