Índice Lucene e Design de consulta Pergunta - Encontrar Pessoas
-
06-07-2019 - |
Pergunta
Eu só recentemente começou a trabalhar com Lucene (especificamente, Lucene.Net) e criou com sucesso vários indicies e não tenho nenhum problema com qualquer um deles. Anteriormente tendo trabalhado com Endeca, acho que Lucene é leve, poderoso e tem uma curva de aprendizado muito mais baixa (devido principalmente a uma API conciso).
No entanto, eu tenho um índice específico / query situação que eu estou tendo problemas envolvendo minha cabeça em torno. O que tenho é um diretório pessoa. As pessoas podem ser procurados nesta aplicação, com o objetivo de retornar ambas as correspondências exatas e aproximadas. Agora, no índice I concatenar o "Nome" e "Sobrenome" em um único campo chamado "FullName", adicionando um espaço entre os dois. Então FirstName: Jon com Sobrenome: Smith rendimento FullName: Jon Smith. Eu faço antecipar a possibilidade de nomes do meio e possivelmente sufixo, mas isso não é importante no momento.
Eu gostaria de fazer o equivalente a uma pesquisa difusa no nome, assim que alguém procurar por "John Smith" ainda iria voltar "Jon Smith". Eu tinha pensado em um Multisearch, no entanto, isso se torna mais envolvidos se seu nome era na verdade "Jon Del Carmen" ou "Jon Paul Del Carmen". Não tenho nada no que o usuário digita para delinear o primeiro nome ou últimas peças de nome.
O único pensamento que eu tenho é que eu poderia substituir os espaços no valor concatenado com um caractere que não seria descartado. Se eu fiz isso quando eu construí o documento para o índice e também quando eu analisado a consulta, eu poderia tratá-lo como uma palavra maior, certo? Existe outra maneira de fazer isso que iria trabalhar para ambos os nomes simples ( "Jon Smith") e também nomes mais complexos ( "Jon Paul Del Carmen")?
Qualquer conselho seria verdadeiramente ser apreciado. Agradecemos antecipadamente!
Editar:. Detalhes adicionais segue
Em Lucas, eu coloquei na consulta a seguir:
FullName:jonn smith~
Está a ser analisado como:
FullName:jonn CreatedOn:smith~0.5
Com uma explicação de:
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" é outro campo no índice. Eu tentei colocar aspas em torno do termo "smith jonn", mas, em seguida, trata-o como um phrasequery, em vez disso. Estou certo de que o problema é que eu não estou fazendo algo certo, mas ser tão verde em tudo isso, eu não sei o que que algo é verdadeiramente.
Solução
Meu problema era com a forma como eu estava construindo o índice. O que eu acabei fazendo foi certificando-se de que não foi tokenizing o FullName, ea consulta começou a retornar os resultados corretos. A explicar os resultados de cima eram devido a um erro ID10T da minha parte e agora está retornando corretamente.