Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Разбор поисковых запросов в Java
Я пытался найти простой способ проанализировать поисковый запрос и преобразовать его в запрос SQL для моего DB.
Я нашел два решения:
- Lucene : мощная поисковая система на основе Java, содержит парсер запросов, но он не очень настраивается, и я мог бы найти способ легко взломать/адаптировать его для создания SQL запросов.
- ANTLR : ветеран текст лексер-парсер. Используется для создания чего угодно-от компиляторов до небоскребов. ANTLR очень легко настраивается, но каждый, кто коснется кода с этого момента, должен будет выучить новый язык...
Есть еще какие-нибудь идеи?
SQL-ORM - это очень легкая библиотека Java, которая включает в себя возможность построения (динамического) запроса SQL в Java в виде графа объектов
IMHO, это гораздо лучший метод для построения динамических запросов SQL, чем обычный метод конкатенации строк.
Отказ от ответственности: я сделал некоторые очень незначительные вклады в этот проект
Что именно вы имеете в виду? Я использовал Lucene для текстового поиска, но там, где он превосходит, он создает индекс и ищет его, а не попадает в базу данных вообще.
Недавно я создал систему, в которой я индексирую таблицу в Lucene, объединяя все столбцы (разделенные пробелами) в одно поле и помещая его в Lucene, а затем также добавляя первичный ключ в отдельный столбец. Lucene выполняет весь поиск и возвращает список первичных ключей, который я использовал, чтобы вытащить заполненный набор результатов и отобразить пользователю.
Преобразование поискового запроса в оператор SQL может показаться мне немного запутанным.
Кроме того, вот отличное начало учебника, объясняющее основную структуру Lucene .
Вы можете попробовать использовать что-то вроде 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. Вы можете гнездиться и выражаться так глубоко, как вам хочется.
Попробуйте объединить инструмент ORM (например, openJPA) и компас (фреймворк для OSEM). Он автоматически индексирует обновления, сделанные с помощью инструментов ORM, и дает вам силу Lucene для поиска. После этого вы, конечно, можете извлечь объект из DB. Он превосходит любое решение поиска на основе SQL.
Во многом это зависит от типа запросов, которые вы должны проанализировать, и в некоторой степени от структуры данных в вашей базе данных. Я предполагаю, что вы не пытаетесь выполнить полнотекстовый поиск в DB (то есть поисковая система по всей вашей DB), потому что, как вам скажет большинство людей, занимающихся поиском информации, производительность для этого ужасна. Инвертированные индексы-это, безусловно, лучший способ сделать это.
Расскажите нам немного больше о реальной проблеме: что пользователи собираются вводить, что они ожидают в качестве вывода и какова модель данных. Разработайте поисковое решение без этих фрагментов информации, и вы получите далеко не оптимальный результат.
Вы правильно предполагаете, что я не ищу полнотекстовый поиск. Информация выглядит примерно так схема для информации о книге: Имя: string, publisher:string, num_pages int, publish_date:date...
Поисковые запросы такого рода:
- Гарри Поттер (поиск любых книг, чье имя имеет как Гарри, так и Поттер)
- publisher:Nature* pages>100 (книги от издателя, начиная с Nature с более чем 100 книг)
- ("Новый год" или Рождество) и подарок (вы получите картину...)
- физика и публикация>1/1/2008 (новые книги по физике)