Я использую Lucene в качестве поисковой системы для следующего требования:
Здесь есть миллионы документов (текстовых файлов).
В каждом текстовом файле есть тысячи слов (простые строки с разделенным пробелом) ).
Пример содержимого текстового файла 1 (просто несколько слов): 0001AAA 0001AAB 0001AA C 0061000 PSBP06 MFBP05 ...
Пример содержимого текстового файла 2 (просто показывает несколько слов): 0001AAX 0001AAB 0001AAN 0061002 PSBP07 MFBP06 ...
Тогда в базе данных собраны миллионы правил. Для простоты понимания я задаю несколько правил ниже:
Правило 1:
СОСТОЯНИЕ 1: С: 0001AAA ИЛИ 0001AA C
СОСТОЯНИЕ 2: С: PSBP06 ИЛИ PSBP07
СОСТОЯНИЕ 3: С: MFBP05
Правило 2:
СОСТОЯНИЕ 1: С: 0001AAN ИЛИ 0001AA C
СОСТОЯНИЕ 2: С: PSBP06
СОСТОЯНИЕ 3: С: PSBP08
СОСТОЯНИЕ 4: НЕ С: MFBP05
Требование, для данного Правило, найдите текстовые файлы, соответствующие по крайней мере одному слову в каждом условии правила.
Я проиндексировал содержимое каждого текстового файла как документ Lucene с полем «FileContents» и другим полем, чтобы просто сохранить файл name.
Итак, для Правила 1 я построил запрос как (0001AAA ИЛИ 0001AA C) И (PSBP06 ИЛИ PSBP07) И (MFBP05)
И для Правила 2 запрос является (0001AAN ИЛИ 0001AA C) И (PSBP06) И (PSBP08) И НЕ (MFBP05).
Запросы работают и могут найти соответствующие текстовые файлы.
Теперь у меня есть другое требование, обратное вышеуказанному требованию. т.е. для данного текстового файла мне нужно найти список правил, которые могут соответствовать.
Пример: для текстового файла 1 «Правило 1» должно соответствовать, потому что текстовый файл 1 имеет 0001AAA, который удовлетворяет условию 1, PSBP06 будет удовлетворять условию 2, MFBP05 будет удовлетворять условию 3.
Правило 1 имеет 3 условия, и по крайней мере одно слово в каждом условии соответствует текстовому файлу 1. Таким образом, правило 1 подходит для текстовый файл 1.
Правило 2 не должно совпадать с текстовым файлом 1, поскольку в нем нет PSBP08.
Я не знаю, могу ли я проиндексировать информацию о "Правиле" в Lucene. Правило может иметь 1 или более условий, поэтому я не могу использовать фиксированное количество полей для запроса. Даже если число полей фиксировано, запрос должен проверять, чтобы каждое поле совпадало хотя бы с одним словом. Можно ли выполнить это требование с помощью Lucene? или я должен go для других вариантов?
Я новичок в Lucene, любая помощь будет оценена.