Одной из возможностей является увеличение размера индекса путем добавления всех подстрок одной и той же строки. поэтому для «abc» вы будете хранить: «a», «b», «c», «ab», «bc», «abc» (это O (n ^ 2) строк).
еще одна возможность - использование подстановочных знаков. индексировать все, что у вас есть, и искать:
<term>*
, a*<term>*
, ..., z*<term>*
вместо <term>
. это займет ОЧЕНЬ больше времени, но это не увеличит размер индекса.
примечание: необходимо искать так много терминов, потому что вы НЕ МОЖЕТЕ использовать подстановочный знак в качестве первой буквы термина.
a*<term>*
означает, что поиск по всем терминам начинается с a, затем не имеет ни одного или каких-либо символов, затем <term>
, а затем снова ни одного или каких-либо символов.
больше информации о терминах и подстановочных знаках в люцене: http://lucene.apache.org/java/2_0_0/queryparsersyntax.html
РЕДАКТИРОВАТЬ:
комбинация из них даст (на мой взгляд) лучшее решение:
индексировать все суффиксы строки, а затем для каждого члена (а не запроса!) - вместо поиска <term>
искать <term>*
. если термин существует как подстрока, он также запускает хотя бы один префикс и находит его.
например: если у вас есть "lifeexpectancy"
, вы будете индексировать:
"lifeexpectancy","ifeexpectancy","feexpectancy","eexpectancy",....,"y"
для того же примера, когда вы хотите искать life expectancy
, вы будете искать life* expectancy*