Парсинг поисковых запросов в Java

Несколько лет спустя в настоящее время официально существует лучшее решение. DOM4 Mutation Observers заменяют устаревшие события мутации DOM3. Они , которые в настоящее время реализованы в современных браузерах как MutationObserver (или как префикс поставщика WebKitMutationObserver в старых версиях Chrome):

MutationObserver = window.MutationObserver || window.WebKitMutationObserver;

var observer = new MutationObserver(function(mutations, observer) {
    // fired when a mutation occurs
    console.log(mutations, observer);
    // ...
});

// define what element should be observed by the observer
// and what types of mutations trigger the callback
observer.observe(document, {
  subtree: true,
  attributes: true
  //...
});

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

childList

  • Установите значение true, если мутации для целей дети должны быть обнаружены.

attributes

  • Установите на true, если необходимо соблюдать мутации для атрибутов цели.

characterData

  • Установите на true, если необходимо наблюдать мутации данных цели.

поддерево

  • Установите, чтобы true, если мутации не просто нацелены, но также должны наблюдаться потомки цели.

attributeOldValue

  • Установите значение true если attributes установлено значение true и значение атрибута цели до того, как необходимо записать мутацию.

characterDataOldValue

  • Установите значение true, если characterData установлено значение true и данные цели до того, как необходимо записать мутацию.

attributeFilter

  • Установить список локальных имен атрибутов (без пространства имен) если не все атрибутные мутации
blockquote>

(Этот список действует с апреля 2014 года; вы можете проверить спецификацию на любые изменения.)

5
задан lpinto.eu 17 April 2015 в 16:27
поделиться

6 ответов

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

По моему скромному мнению, это - намного лучшая техника для создания динамических SQL-запросов, чем обычная Строка concatentation метод.

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

3
ответ дан 15 December 2019 в 06:38
поделиться

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

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

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

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

1
ответ дан 15 December 2019 в 06:38
поделиться

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

Например: "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);
}

Можно вообразить остальных. Можно вложить И выражения так глубоко, как Вы хотите.

1
ответ дан 15 December 2019 в 06:38
поделиться

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

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

0
ответ дан 15 December 2019 в 06:38
поделиться

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

Поисковые запросы являются видом:

  1. У Harry Potter (ищут любые книги, кто имя, есть и Harry и Potter),
  2. publisher:Nature* страницы> 100 (заказывает от издателя, запускающегося с Природы больше чем с 100 книгами),
  3. ("Новые годы" или Рождество) и подарок (Вы получаете изображение...),
  4. физика и публикует> 01.01.2008 (новые книги по физике)
0
ответ дан 15 December 2019 в 06:38
поделиться

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

0
ответ дан 15 December 2019 в 06:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: