Обратный поиск в Hibernate Search - PullRequest
2 голосов
/ 16 апреля 2010

Я использую Hibernate Search (который использует Lucene) для поиска некоторых данных, которые я проиндексировал в каталоге. Это работает нормально, но мне нужно сделать обратный поиск. Под обратным поиском я подразумеваю, что у меня есть список запросов, хранящихся в моей базе данных, и мне нужно проверять, какой из этих запросов соответствует объекту данных каждый раз при создании объекта данных. Мне нужно, чтобы предупредить пользователя, когда объект данных совпадает с созданным им запросом. Поэтому мне нужно проиндексировать этот единственный объект данных, который только что был создан, и посмотреть, какие запросы в моем списке содержат этот объект.

Я видел, как Lucene MemoryIndex Class создает индекс в памяти, поэтому я могу сделать что-то вроде этого примера для каждого запроса в списке (хотя итерация в списке запросов Java не будет очень эффективной):

//Iterating over my list<Query>
MemoryIndex index = new MemoryIndex();
//Add all fields
index.addField("myField", "myFieldData", analyzer);
...
QueryParser parser = new QueryParser("myField", analyzer);
float score = index.search(query);
if (score > 0.0f) {
    System.out.println("it's a match");
} else {
    System.out.println("no match found");
}

Проблема здесь в том, что этот класс данных имеет несколько аннотаций поиска Hibernate @ Field, @ IndexedEmbedded, ... которые указывают, как поля должны индексироваться, поэтому, когда я вызываю метод index () для экземпляра FullTextEntityManager, он использует эту информацию для индексировать объект в каталоге. Есть ли подобный способ индексировать его в памяти, используя эту информацию?

Есть ли более эффективный способ обратного поиска?

Ответы [ 2 ]

4 голосов
/ 13 ноября 2010

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

...
BooleanQuery query = new BooleanQuery();
query.add(storedQuery, BooleanClause.Occur.MUST);
query.add(new TermQuery(ProjectionConstants.ID, id), BooleanClause.Occur.MUST);
... 

Если вы получили результат, то знаете, что запрос соответствует.

0 голосов
/ 16 апреля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...