(N) Hibernate.search: Indexi diferentes propriedades em um campo
-
20-09-2019 - |
Pergunta
Quando eu estava usando o Lucene para indexar minhas entidades, tinha o hábito de colocar todas as minhas propriedades indexadas em um campo chamado "All", para realizar uma pesquisa em "All" dos meus tipos de entidades.
Agora, usando o Nibernate.search, não consigo encontrar como fazer isso. Eu tentei o seguinte:
[Indexed(Index = "MyIndex")]
public class Post
{
[DocumentId]
public virtual int Id { get; set; }
[IndexedEmbedded]
public virtual Author Author { get; set; }
[IndexedEmbedded]
public virtual IEnumerable<Category> Categories { get; set; }
[Field(Index.Tokenized, Store = Store.Yes)]
[Field(Name = "All", Index = Index.Tokenized, Store = Store.Yes)]
public virtual string Name { get; set; }
[Field(Name = "All", Index = Index.Tokenized, Store = Store.Yes)]
[Field(Index.Tokenized, Store = Store.Yes)]
public virtual string Body { get; set; }
}
Mas tenho uma exceção lançada: "Chave já presente no dicionário", na linha 26 de ScopeDanalyzer.cs:
scopedAnalyzers.Add(scope, analyzer);
Onde "Scope" é o nome do campo Index (aqui, "All"). Se eu fizer um cheque como
if( !scopedAnalyzers.ContainsKey( scope ) )
Funcionará muito bem: terei 2 campos para cada documento "post", um com o corpo, um com o nome. No entanto, não estou em fácil modificar o código -fonte do Nibernate.search.
Alguém tem uma sugestão sobre como indexar propriedades diferentes em um campo?
Solução
Se você estiver tendo problemas para usar os atributos de campo para especificar o que você precisa, pode criar uma ponte de classe que permitirá criar seu próprio documento.
Basta usar o ClassBridGeattribute na definição da classe e especificar um tipo que implementa a interface ifieldbridge. Isso permitirá que você tenha controle completo sobre como os documentos do Lucene são construídos.
Mais informações podem ser encontradas em http://docs.jboss.org/hibernate/stable/search/reference/en/html/search-mapping-bridge.html Veja o 4.2.2.3. Seção de Classbridge