使用Solr& amp;自动完成功能春天 - 多个单词的问题

时间:2013-05-08 13:06:19

标签: java solr lucene spring-data spring-data-solr

我使用Spring Data Solr索引了一个位置数据库。我有以下字段:

   <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
   <field name="name" type="text_ws" indexed="true" stored="true"/>
   <field name="autocomplete" type="lowercase" indexed="true" stored="false"/>

我正在尝试实现自动完成功能。我的ajax调用由一个控制器处理,该控制器使用:

调用存储库
List<POISearch> findByAutocompleteStartingWith(String autocomplete, Pageable pageable);

这适用于“加利福尼亚”或“洛杉矶”之类的搜索。但是当我尝试像“洛杉矶”这样的多个单词时,我得到了一个例外:

  

SEVERE:servlet [spring-mvc]的Servlet.service()与上下文有关   path [/ xxx]抛出异常[请求处理失败;嵌套   例外是   org.springframework.dao.InvalidDataAccessApiUsageException:不能   constructQuery'“los an”'。使用epxression或mulitple子句   相反。]有根本原因   org.springframework.dao.InvalidDataAccessApiUsageException:不能   constructQuery'“los an”'。使用epxression或mulitple子句   代替。在   org.springframework.data.solr.core.query.Criteria.assertNoBlankInWildcardedQuery(Criteria.java:596)     在   org.springframework.data.solr.core.query.Criteria.contains(Criteria.java:230)     在   org.springframework.data.solr.core.query.Criteria.contains(Criteria.java:257)     在   org.springframework.data.solr.core.query.Criteria.contains(Criteria.java:244)     在   org.springframework.data.solr.repository.query.SolrQueryCreator.from(SolrQueryCreator.java:112)     在   org.springframework.data.solr.repository.query.SolrQueryCreator.create(SolrQueryCreator.java:56)     在   org.springframework.data.solr.repository.query.SolrQueryCreator.create(SolrQueryCreator.java:43)     在   org.springframework.data.repository.query.parser.AbstractQueryCreator.createCriteria(AbstractQueryCreator.java:109)     在   org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:88)     在   org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:73)     在   org.springframework.data.solr.repository.query.PartTreeSolrQuery.createQuery(PartTreeSolrQuery.java:46)     在   org.springframework.data.solr.repository.query.AbstractSolrQuery.execute(AbstractSolrQuery.java:95)     在   org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:312)     在   org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)     在   org.springframework.transaction.interceptor.TransactionInterceptor $ 1.proceedWithInvocation(TransactionInterceptor.java:96)     在   org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)     在   org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)     在   org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)     在   org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155)     在   org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)     在   org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)     在$ Proxy44.findByAutocompleteContaining(未知来源)

任何想法如何解决?

2 个答案:

答案 0 :(得分:1)

使用最新版本的spring-data-solr,您可以执行以下操作:

List<POISearch> results = repository.findByAutocompleteStartingWith(Arrays.asList("los", "ange"));

效果很好!

感谢Christoph帮助回答:https://jira.springsource.org/browse/DATASOLR-74

答案 1 :(得分:0)

通常,您无法对短语执行通配符查询,这就是此处出现的情况。

我不知道findByAutocompleteStartingWith的实现,但看起来它只是构建一个PrefixQuery,或类似的东西。这个异常是由一个断言抛出的,所以它的设计非常明确,只是为单字查询提出单字建议。

因此,您只能将一个单词传入其中。通常,输入的是最后一个单词。