Lucene 使用AnalyzerDiscriminator进行Hibernate搜索-仅在创建实体时调用Analyzer?

Lucene 使用AnalyzerDiscriminator进行Hibernate搜索-仅在创建实体时调用Analyzer?,lucene,hibernate-search,query-analyzer,Lucene,Hibernate Search,Query Analyzer,你能帮我吗 我正在实现Hibernate搜索,以检索本地化网站上的全局搜索结果(葡萄牙语和英语内容) 为此,我遵循了Hibernate搜索文档中指示的步骤: 除了实体本身的特定配置之外,我还按照本文档中的说明实现了一个“LanguageDiscriminator”类 因为我没有得到我期望的结果(例如,我的实体存储了文本“Capuchinho”,但当我搜索“capucho”时,我没有得到任何点击),所以我决定尝试并调试执行,并尝试了解我配置的分析器是否正在使用 在为数据库中的实体创建新记录时,我

你能帮我吗

我正在实现Hibernate搜索,以检索本地化网站上的全局搜索结果(葡萄牙语和英语内容)

为此,我遵循了Hibernate搜索文档中指示的步骤:

除了实体本身的特定配置之外,我还按照本文档中的说明实现了一个“LanguageDiscriminator”类

因为我没有得到我期望的结果(例如,我的实体存储了文本“Capuchinho”,但当我搜索“capucho”时,我没有得到任何点击),所以我决定尝试并调试执行,并尝试了解我配置的分析器是否正在使用

在为数据库中的实体创建新记录时,我可以看到调用了“LanguageDiscriminator”中的“getAnalyzerDefinitionName()”方法。伟大的但当我执行搜索时,不会发生同样的情况。谁能解释一下原因吗

我将代码的关键部分发布在下面。非常感谢您的反馈

这是我想要索引的一个实体

@Entity
@Table(name="NEWS_HEADER")
@Indexed
@AnalyzerDefs({
@AnalyzerDef(name = "en",
        tokenizer = @TokenizerDef(factory =     StandardTokenizerFactory.class),
        filters = {
            @TokenFilterDef(factory = LowerCaseFilterFactory.class),
            @TokenFilterDef(factory = SnowballPorterFilterFactory.class, 
                            params = {@Parameter(name="language", value="English")}
            )
        }
),
@AnalyzerDef(name = "pt",
        tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
        filters = {
            @TokenFilterDef(factory = LowerCaseFilterFactory.class),
            @TokenFilterDef(factory = SnowballPorterFilterFactory.class, 
                            params = {@Parameter(name="language", value="Portuguese")}
            )
        }
)
})
public class NewsHeader implements Serializable {

static final long serialVersionUID = 20140301L;

private int         id;
private String          articleHeader;
private String          language;
private Set<NewsParagraph>  paragraphs = new HashSet<NewsParagraph>();

/**
 * @return the id
 */
@Id
@Column(name="ID")
@GeneratedValue(strategy=GenerationType.AUTO)
@DocumentId
public int getId() {
    return id;
}
/**
 * @param id the id to set
 */
public void setId(int id) {
    this.id = id;
}
/**
 * @return the articleHeader
 */
@Column(name="ARTICLE_HEADER")
@Field(index=Index.YES, store=Store.NO)
public String getArticleHeader() {
    return articleHeader;
}
/**
 * @param articleHeader the articleHeader to set
 */
public void setArticleHeader(String articleHeader) {
    this.articleHeader = articleHeader;
}
/**
 * @return the language
 */
@Column(name="LANGUAGE")
@Field
@AnalyzerDiscriminator(impl=LanguageDiscriminator.class)
public String getLanguage() {
    return language;
}
...
}
这是我在SearchDAO中提供的搜索方法

public List<NewsHeader> searchParagraph(String patternStr) {

    Session session = null;

    Transaction tx;

    List<NewsHeader> result = null;

    try {
        session = sessionFactory.getCurrentSession();
        FullTextSession fullTextSession = Search.getFullTextSession(session);
        tx = fullTextSession.beginTransaction();

        // Create native Lucene query using the query DSL
        QueryBuilder queryBuilder = fullTextSession.getSearchFactory()
            .buildQueryBuilder().forEntity(NewsHeader.class).get();

        org.apache.lucene.search.Query luceneSearchQuery = queryBuilder
            .keyword()
            .onFields("articleHeader", "paragraphs.content")
            .matching(patternStr)
            .createQuery();

        // Wrap Lucene query in a org.hibernate.Query
        org.hibernate.Query hibernateQuery = 
            fullTextSession.createFullTextQuery(luceneSearchQuery, NewsHeader.class, NewsParagraph.class);

        // Execute search
        result = hibernateQuery.list();

    } catch (Exception xcp) {
        logger.error(xcp);
    } finally {

        if ((session != null) && (session.isOpen())) {
            session.close();
        }
    }
    return result;
}
公共列表搜索段落(字符串模式){
会话=空;
交易发送;
列表结果=空;
试一试{
session=sessionFactory.getCurrentSession();
FullTextSession FullTextSession=Search.getFullTextSession(会话);
tx=fullTextSession.beginTransaction();
//使用查询DSL创建本地Lucene查询
QueryBuilder QueryBuilder=fullTextSession.getSearchFactory()
.buildQueryBuilder().forEntity(newheader.class).get();
org.apache.lucene.search.Query luceneSearchQuery=queryBuilder
.keyword()
.onFields(“文章标题”、“段落内容”)
.matching(patternStr)
.createQuery();
//在org.hibernate.query中包装Lucene查询
org.hibernate.Query hibernateQuery=
createFullTextQuery(luceneSearchQuery、NewsHeader.class、NewsParague.class);
//执行搜索
结果=hibernateQuery.list();
}捕获(异常xcp){
记录器错误(xcp);
}最后{
if((session!=null)&&(session.isOpen()){
session.close();
}
}
返回结果;
}
分析器的选择取决于给定实体的状态,在您的示例中是NewHeader。您正在索引期间处理实体实例。在查询没有实体的情况下,您正在搜索它们。您将休眠搜索哪个分析器以选择查询

也就是说,我认为DSL有一个缺点。它不允许您显式指定类的分析器。有ignoreAnalyzer,但那不是你想要的。我想你可以在搜索问题跟踪器中创建一个功能请求-


同时,您可以使用原生Lucene查询API构建查询。但是,您需要知道查询的目标语言(例如,通过登录用户的首选语言或其他语言)。这将取决于您的用例。这可能是您从错误的功能开始考虑的

谢谢你,哈代。我觉得有点奇怪,我们可以选择在Hibernate搜索中使用哪些分析器,但只用于索引目的,而不是执行搜索本身。不过我会尝试你的建议,并尝试通过Lucene API执行搜索。@Eduardomedes我也有同样的问题。除了使用lucene api,您还解决了这个问题吗?你填了一个专题报告了吗?蒂亚!
public List<NewsHeader> searchParagraph(String patternStr) {

    Session session = null;

    Transaction tx;

    List<NewsHeader> result = null;

    try {
        session = sessionFactory.getCurrentSession();
        FullTextSession fullTextSession = Search.getFullTextSession(session);
        tx = fullTextSession.beginTransaction();

        // Create native Lucene query using the query DSL
        QueryBuilder queryBuilder = fullTextSession.getSearchFactory()
            .buildQueryBuilder().forEntity(NewsHeader.class).get();

        org.apache.lucene.search.Query luceneSearchQuery = queryBuilder
            .keyword()
            .onFields("articleHeader", "paragraphs.content")
            .matching(patternStr)
            .createQuery();

        // Wrap Lucene query in a org.hibernate.Query
        org.hibernate.Query hibernateQuery = 
            fullTextSession.createFullTextQuery(luceneSearchQuery, NewsHeader.class, NewsParagraph.class);

        // Execute search
        result = hibernateQuery.list();

    } catch (Exception xcp) {
        logger.error(xcp);
    } finally {

        if ((session != null) && (session.isOpen())) {
            session.close();
        }
    }
    return result;
}
When creating a new record for the entity in the database, I can see that the "getAnalyzerDefinitionName()" method from the "LanguageDiscriminator" gets called. Great. But the same does not happen when I execute a search. Can anyone explain me why?