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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top