Сведения о вопросе

Kimsanov

06:15, 5th August, 2020

Теги

java   search    

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

Просмотров: 430   Ответов: 7

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

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

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

Есть еще какие-нибудь идеи?



  Сведения об ответе

PIRLO

18:58, 29th August, 2020

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

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

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


  Сведения об ответе

LIZA

17:20, 6th August, 2020

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

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

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

Кроме того, вот отличное начало учебника, объясняющее основную структуру Lucene .


  Сведения об ответе

прога

01:47, 20th August, 2020

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

Например: "Harry Potter" становится

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

И "publisher:Nature* страниц > 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);
}

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


  Сведения об ответе

qwerty101

04:19, 12th August, 2020

Попробуйте объединить инструмент ORM (например, openJPA) и компас (фреймворк для OSEM). Он автоматически индексирует обновления, сделанные с помощью инструментов ORM, и дает вам силу Lucene для поиска. После этого вы, конечно, можете извлечь объект из DB. Он превосходит любое решение поиска на основе SQL.


  Сведения об ответе

прога

19:00, 7th August, 2020

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

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


  Сведения об ответе

SKY

20:37, 18th August, 2020

Вы правильно предполагаете, что я не ищу полнотекстовый поиск. Информация выглядит примерно так схема для информации о книге: Имя: string, publisher:string, num_pages int, publish_date:date...

Поисковые запросы такого рода:

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


  Сведения об ответе

SILA

09:26, 8th August, 2020

Строковый массив;

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

}


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться