Запрос Lucene по порядку

#java #lucene

#java #lucene

Вопрос:

Я создал lucene в java index и могу выполнять поиск. Теперь я хочу, чтобы мой запрос был таким, чтобы он поддерживал порядок. Скажем, например, у меня в моем индексе есть следующее

 1 2 3 4 5
1 2 3 4 1
1 2 4 3 1
1 3 2 4 1
  

И мой запрос 1 3 4 тогда он должен дать результат, подобный :

 1 2 3 4 5
1 2 3 4 1
1 3 2 4 1
1 2 4 3 1
  

Надеюсь, вопрос ясен.

Спасибо, Рави.

Ответ №1:

Вы можете использовать span query для поиска терминов, которые находятся в непосредственной близости и в определенном порядке. Условие упорядочения может быть смягчено. Отличную статью о spans можно найти здесь.

Комментарии:

1. На мой взгляд, это выглядит неплохо. Все еще нужен способ создать запрос: Изначально я использовал «Запрос q1 = новый запрос (версия. LUCENE_CURRENT, «Id», анализатор).parse(dis.readLine());» Если я использую запрос SpanQuery, будет что-то вроде «SpanNearQuery q = новый запрос SpanNearQuery(новый запрос SpanQuery[] { новый запрос SpanTermQuery(новый термин («Id»,»1″)),новый запрос SpanTermQuery(новый термин («Id», «2»))},5000, верно);». Как я могу разобрать запрос за один раз из файла. Мой запрос будет иметь длину «1 2 3» или «1 3 4 5» и т.д.

Ответ №2:

Можете ли вы использовать BooleanQuery и обязательно вызвать setAllowDocsOutOfOrder(true) . Если ваш индекс упорядочен по docid, это должно предотвратить беспорядок в документах.

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

Комментарии:

1. когда я использую setAllowDocsOutOfOrder (true), он выдает символ «не удается найти». чего я не понимаю? Также, как здесь полезна сортировка, мой запрос также может быть 1 4 3, и в этом случае последний полученный, т. е. 1 2 4 3 1 должен быть первым.

2. О, я неправильно понял ваш вопрос. Теперь кажется, что вы хотите, чтобы обращения были отсортированы таким образом, чтобы отношения перед термином в документах соответствовали порядку терминов в запросе. Я думал, вы имели в виду, что порядок по идентификатору документа будет сохранен. Похоже, вам следует определить свой собственный метод подсчета очков.