Вот работающий пример поиска по неточному вхождению:
public static void main(String[] args) throws Exception {
String fieldName = "myField";
//создание тестового индекса
Directory directory = new RAMDirectory();//в "настоящей" Системе здесь должно быть FSDirectory.open(dir)
RussianAnalyzer analyzer = new RussianAnalyzer(Version.LUCENE_46);
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_46, analyzer);
IndexWriter writer = new IndexWriter(directory, config);
writer.addDocument(createDocument(fieldName, "Я живу у мамы"));
writer.addDocument(createDocument(fieldName, "В доме было холодно"));
writer.commit();
writer.close();
//поиск
int startFrom = 0;
int pageSize = 20;
DirectoryReader ireader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(ireader);
//FuzzyQuery осуществляет поиск неточных вхождений
FuzzyQuery wildcardQuery = new FuzzyQuery(new Term(fieldName, "мама"));
TopDocs topDocs = indexSearcher.search(wildcardQuery, startFrom + pageSize);
ScoreDoc[] hits = topDocs.scoreDocs;
for (int i = startFrom; i < topDocs.totalHits; i++) {
if (i > (startFrom + pageSize) - 1) {
break;
}
Document hitDoc = indexSearcher.doc(hits[i].doc);
if (hitDoc != null) {
System.out.println(hitDoc.get(fieldName));
}
}
}
Часть исходников взята с серьёзной промышленной Системы, так что если что-то кажется странным, не думайте, просто используйте. Когда всё заработает "как часы", тогда вернётесь к "странностям" и поразмыслите, стоит ли переделывать...