我使用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(未知来源)
任何想法如何解决?
答案 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
,或类似的东西。这个异常是由一个断言抛出的,所以它的设计非常明确,只是为单字查询提出单字建议。
因此,您只能将一个单词传入其中。通常,输入的是最后一个单词。