2014-11-02 3 views
0

Я использую спящий поиск 4.2.0 с спящим 4.2.15 и весной 3.2.10. У меня странное поведение при использовании запроса поиска спящего режима (lucene).спящий поисковый запрос с акцентом

В базе данных у меня есть это значение для содержимого поля: «méchant». Когда я делаю запрос с «mechant», он отлично работает, я получаю объект. Но когда я использую "Mechant" это не работает ...

по картированию:

@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); 

Разве кто-то может мне помочь?

[EDIT] Спасибо всем, я решил проблему: это было не из-за поиска в спящем режиме, а в кодировке моего HTTP-запроса. Я проверю, как исправить мою проблему с кодировкой. Извините за пустую трату времени ...

+0

Понятно, что у вас есть проблема с неправильным анализатором, используемым во время запроса. Я действительно не очень понимаю, как Hibernate обрабатывает анализаторы во время запроса, так что здесь просто gues, но что произойдет, если вы измените 'onFields (« content »)' на 'onField (« content »)'? – femtoRgon

+0

Если я использую 'onField (« content »)', нет изменений:/ – Asa42

ответ

0

В вашем примере вы используете только SnowballPorterFilterFactory без указания параметра языка. Это значение по умолчанию соответствует английскому, что, вероятно, не то, что вы хотите. Вы пытались изменить это на язык, на который вы нацеливаетесь?

+0

С помощью этого: '@TokenFilterDef (factory = SnowballPorterFilterFactory.class, params = @Parameter (name =" language ", value =" French ") ' Нет эффекта ... – Asa42

Смежные вопросы