Вопрос по индексу и дизайну запросов Lucene - поиск людей - PullRequest
0 голосов
/ 23 октября 2009

Я недавно только начал работать с 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" - это другое поле в индексе. Я попытался привести кавычки вокруг термина «Джонн Смит», но вместо этого он воспринимает это как фразу-запрос. Я уверен, что проблема в том, что я просто не делаю что-то правильно, но, будучи настолько зеленым, я не уверен, что это такое на самом деле.

1 Ответ

0 голосов
/ 23 октября 2009

Моя проблема была в том, как я строил индекс. В итоге я убедился, что это не токенизация FullName, и запрос начал возвращать правильные результаты. Вышеуказанные результаты объяснения произошли из-за ошибки ID10T с моей стороны и теперь возвращаются правильно.

...