【问题标题】:hibernate search query with accent带有重音符号的休眠搜索查询
【发布时间】:2014-12-29 14:29:15
【问题描述】:

我将 hibernate search 4.2.0 与 hibernate 4.2.15 和 spring 3.2.10 一起使用。 使用休眠搜索 (lucene) 查询时,我有一个奇怪的行为。

在数据库中,我为字段内容设置了这个值:“méchant”。 当我使用“mechant”进行查询时,它工作正常,我得到了对象。 但是当我使用“méchant”时它不起作用......

映射:

@Entity
@Indexed
@AnalyzerDef(name = "customAnalyzer",
    tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
    filters = {
        @TokenFilterDef(factory = LowerCaseFilterFactory.class),
        @TokenFilterDef(factory = ASCIIFoldingFilterFactory.class),
        @TokenFilterDef(factory = SnowballPorterFilterFactory.class)
    })
@Table(name = "MESSAGE")
public class Message {

    ...

    @Id
    @DocumentId
    @GeneratedValue
    @Column(name = "ID_MESSAGE")
    public Integer getId() {
        return id;
    }

    @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
    @Analyzer(definition="customAnalyzer")
    @Column(name = "CONTENT", length = 65535, columnDefinition = "Text")
    public String getContent() {
        return content;
    }

    ...
]

休眠配置:

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" >
    <property name="dataSource" ref="customDataSource" />
    <property name="hibernateProperties">
        <props>
        <prop key="hibernate.bytecode.provider">javassist</prop>
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
        <prop key="hibernate.show_sql">${hibernate.showSql}</prop>
        <prop key="hibernate.hbm2ddl.auto">validate</prop>
        <prop key="hibernate.search.default.directory_provider">filesystem</prop>

        <prop key="hibernate.search.default.indexBase">${indexLucene.path}</prop>
        </props>
    </property>
</bean>    

查询:

FullTextSession searchSession = Search.getFullTextSession(getSessionFactory().getCurrentSession());
QueryBuilder qb = searchSession.getSearchFactory().buildQueryBuilder().forEntity(Message.class).get();
BooleanJunction<BooleanJunction> bool = qb.bool();

...

bool.must(qb.keyword().boostedTo(4f)
    .onFields("content")
    .matching(messageCriteria.getQuery())
    .createQuery());
...

org.apache.lucene.search.Query luceneQuery =bool.createQuery(); 
FullTextQuery jpaQuery = searchSession.createFullTextQuery(luceneQuery, Message.class);

有人可以帮助我吗?

[编辑] 谢谢大家,我解决了这个问题:这不是由于休眠搜索,而是我的 http 请求的字符集。我将检查如何解决我的字符集问题。 抱歉浪费了时间...

【问题讨论】:

  • 似乎很清楚,您在查询时使用了错误的分析器。我真的不太清楚 Hibernate 在查询时如何处理分析器,所以这里只是猜测,但是如果你将 onFields("content") 更改为 onField("content") 会发生什么?
  • 如果我使用onField("content"),没有变化:/

标签: java lucene hibernate-search accent-insensitive


【解决方案1】:

在您的示例中,您只是使用 SnowballPorterFilterFactory 而不指定语言参数。这默认为英语,这可能不是您想要的。您是否尝试将其更改为您的目标语言?

【讨论】:

  • 有了这个:@TokenFilterDef(factory = SnowballPorterFilterFactory.class, params = @Parameter(name="language", value="French")没有效果...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多