首页 文章

使用Solr和Spring自动完成 - 多个单词的问题

提问于
浏览
1

我使用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()在路径[/ xxx]的上下文中引发异常[请求处理失败;嵌套异常是org.springframework.dao.InvalidDataAccessApiUsageException:无法构造查询'“los an”' . 改为使用epxression或mulitple子句 . ]带根本原因org.springframework.dao.InvalidDataAccessApiUsageException:无法构造查询'“los an”' . 请改用epxression或mulitple子句 . 在Org.springframework的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的org.springframework.data.solr.core.query.Criteria.contains(Criteria.java:244)的.data.solr.core.query.Criteria.contains(Criteria.java:257)位于org.springframework.data.solr.repository.query的org.springframework.data.solr.repository.query.SolrQueryCreator.create(SolrQueryCreator.java:56)中的.repository.query.SolrQueryCreator.from(SolrQueryCreator.java:112) .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)at org .springframework.data.solr.repository.query.PartTreeSolrQuery.createQuery(PartTreeSolrQuery.java:46)位于org.springframework.data的org.springframework.data.solr.repository.query.AbstractSolrQuery.execute(AbstractSolrQuery.java:95) .repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:312)org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)org.springframework.transaction.interceptor.TransactionInterceptor $ 1 . 在org.springframework上的org.springframework.transaction.intercts.Traringaction(TransactionAspectSupport.java:260)org.springframework.transaction.intercts.TransactionInterceptor.invoke(TransactionInterceptor.java:94)的org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)上的进行任务(TransactionInterceptor.java:96) ora.springframework.dao.support.PersistenceExceptionTransla中的.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)中的orInter.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)处的onInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155)at $ Proxy44.findByAutocompleteContaining(未知来源)

任何想法如何解决?

2 回答

  • 0

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

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

    效果很好!

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

  • 1

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

    我不知道 findByAutocompleteStartingWith 的实现,但它似乎只是 Build 一个 PrefixQuery ,或类似的东西 . 这个异常是由一个断言引发的,所以它的设计非常明确,只是为单字查询提出单字建议 .

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

相关问题