Я недавно только начал работать с Lucene (в частности, Lucene.Net) и успешно создал несколько индикаторов, и у меня нет проблем ни с одним из них. Ранее, работая с Endeca, я обнаружил, что Lucene является легким, мощным и имеет гораздо более низкую кривую обучения (в основном благодаря лаконичному API).
Однако у меня есть одна конкретная ситуация с индексом / запросом, из-за которой у меня возникают проблемы с нахождением головы. У меня есть личный справочник. В этом приложении можно искать людей с целью получения точных и приблизительных совпадений. Прямо сейчас в индексе я объединяю «FirstName» и «LastName» в одно поле с именем «FullName», добавляя пробел между ними. Итак, FirstName: Jon с LastName: Smith дают полное имя: Jon Smith. Я предвкушаю возможность отчества и, возможно, суффикса, но на данный момент это не важно.
Я хотел бы сделать эквивалент нечеткого поиска по имени, поэтому кто-то, ищущий «Джона Смита», все равно вернул бы «Джона Смита». Я думал о многопользовательском поиске, однако, это становится более сложным, если его имя на самом деле было «Джон Дель Кармен» или «Джон Пол Дель Кармен». У меня нет ничего в том, что пользователь вводит, чтобы разграничить части имени или фамилии.
Единственная мысль, которая у меня есть, заключается в том, что я могу заменить пробелы в объединенном значении символом, который не будет отброшен. Если бы я сделал это при создании документа для индекса, а также при разборе запроса, я мог бы рассматривать его как одно большее слово, верно? Есть ли другой способ сделать это, который работал бы как для простых имен («Джон Смит»), так и для более сложных имен («Джон Пол Дель Кармен»)?
Любой совет будет по достоинству оценен. Заранее спасибо!
Редактировать: дополнительная информация приведена ниже.
В Люк я вставил следующий запрос:
FullName:jonn smith~
Он анализируется как:
FullName:jonn CreatedOn:smith~0.5
С объяснением:
BooleanQuery:boost=1.0000
clauses=2, maxClauses=1024
Clause 0: SHOULD
TermQuery:boost=1.0000
Term: field='FullName' text='jonn'
Cluase 1: SHOULD
FuzzyQuery: boost=1.0000
prefixLen=0, minSimilarity=0.5000
org.apache.lucene.search.FuzzyTermEnum: diff=-1.0000
FilteredTermEnum: Exception null
"CreatedOn" - это другое поле в индексе. Я попытался привести кавычки вокруг термина «Джонн Смит», но вместо этого он воспринимает это как фразу-запрос. Я уверен, что проблема в том, что я просто не делаю что-то правильно, но, будучи настолько зеленым, я не уверен, что это такое на самом деле.