2016-03-03 2 views
0

Для простоты рассмотрит два документа со следующими полями и значениями:Lucene - Запрос несколько терминов в области

RecordId: "12345" 
CreatedAt: "27/02/1992" 
Event: "Manchester, Dubai, Paris" 
Event: "Manchester, Rome, Madrid" 
Event: "Madrid, Sidney" 


RecordId: "99999" 
CreatedAt: "27/02/1992" 
Event: "Manchester, Barcelona, Rome" 
Event: "Rome, Paris" 
Event: "Milan, Barcelona" 

Можно ли выполнить поиск нескольких терминов в одном экземпляре «Event "поле?

Скажем, я хочу найти «Манчестер» и «Париж», чтобы появиться в том же поле. Вторая запись содержит «Манчестер» и «Париж», но в разных экземплярах поля «Событие», которая не должна быть частью набора результатов.

В идеале, набор результатов будет только первой записью (12345).

+0

Эй, Пеликан. Возможно индексировать каждую запись (RecordID) один раз для каждого поля Event с суффиксом RecordID для каждого из них. В вашем примере у вас будет шесть индексов, 12345-1. 12345-2. 12345-3 и т. Д. У вас будет гораздо больший индекс, и вам нужно будет отфильтровать повторяющиеся образы (если, например, у вас также было мероприятие «Манчестер, Детройт, Париж»), но я думаю, что это сработает , –

+0

Я вижу вашу точку зрения, но этот подход в конечном итоге в конечном итоге даст мне кошмары. Тем не менее, это сработает. –

+0

Да, я не делал это формальным ответом, потому что это кажется клочковым, хотя это сработает. Если вы пойдете с этим подходом, пожалуйста, дайте мне знать. –

ответ

1

В зависимости от анализатора, который используется для поля (это потребуется tokenise и удалить знаки препинания). Вы можете использовать запрос фразы.

«manchester paris» ~ 2 должен найти только 12345. В зависимости от количества и порядка значений в каждом поле, возможно, вам понадобится использовать более крупный откос.

Отклонение определяет количество «операций» по фразе, допускаемой для соответствия. Это может быть переупорядочение или дополнительные условия внутри фразы.

Таким образом, «х» ~ 1 может соответствовать

  • «уг»
  • «х Фред у»
  • , но не «у Фреда х» (что потребовало бы два Ops: болота плюс дополнение)

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

+0

Мне не было известно о запросах фразы. Итак, slop-запрос из 2-х шагов найдет все записи, содержащие в одном поле термины «manchester» и «paris» в любом заданном порядке? –

+1

Короткий ответ: да, правильно Я обновил ответ немного больше о том, что делает slop – AndyPook

+0

Для поля без установленного максимального количества терминов, было бы лишним, чтобы установить slop в int.MaxValue? –

1

Как насчет индексации Событие как не-токенизованное поле, а затем с помощью ключевого словаря для него. Затем можно использовать Lucene-х Regex query, чтобы соответствовать появление как Манчестер и Париж:

Event: "/^.*(Manchester).+(Paris).*$/" 
+0

Интересно. Любые огромные хиты производительности при использовании запросов Regex? –

+1

Запросы regex недоступны в текущей версии lucene.net (на основе 3.0.3) – AndyPook

+0

Запросы регулярных запросов медленны до 4.0 (Lucene Java), но с v4.0+ Запросы Regex выполняются с использованием динамически построенных автоматов, поэтому его намного быстрее. Если вы используете .NET, я бы рекомендовал использовать FlexLucene (порт на основе IKVM последней Lucene Java) вместо Lucene.NET. –

Смежные вопросы