Java 使用Solr&;自动完成;春季-多词发行
我已经使用SpringDataSolr为一个位置数据库编制了索引。我有以下字段:Java 使用Solr&;自动完成;春季-多词发行,java,solr,lucene,spring-data,spring-data-solr,Java,Solr,Lucene,Spring Data,Spring Data Solr,我已经使用SpringDataSolr为一个位置数据库编制了索引。我有以下字段: <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="autocom
<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);
List findbyautompletestartingwith(字符串自动完成,可分页);
这适用于“California”或“Los”之类的搜索。但当我尝试使用“Los Ang”这样的多个词时,我得到了一个例外:
严重:Servlet[spring mvc]的Servlet.service()与
路径[/xxx]引发异常[请求处理失败;嵌套
例外是
org.springframework.dao.InvalidDataAccessApiUsageException:无法
constructQuery“los an”。使用ePxPression或多个子句
而是有根本原因
org.springframework.dao.InvalidDataAccessApiUsageException:无法
查询“los an”。使用EPXpression或多个子句
相反在
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.procedue(ReflectiveMethodInvocation.java:172)
在
org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
在
org.springframework.transaction.interceptor.TransactionSpectSupport.invokeWithinTransaction(TransactionSpectSupport.java:260)
在
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
在
org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:172)
在
org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155)
在
org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:172)
在
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
位于$Proxy44.findbyautompletecontaining(未知来源)
你知道怎么解决吗?通常,你不能对一个短语执行通配符查询,这就是这里发生的事情 我不知道
findbyautompletestartingwith
的实现,但它似乎只是在构建一个前缀查询
,或者类似的东西。该异常是由断言引发的,因此它被非常明确地设计为仅为单词查询提供单词建议
因此,您只能在其中传递一个单词。通常,输入最后一个单词。使用最新版本的spring data solr,您可以执行以下操作:
List<POISearch> results = repository.findByAutocompleteStartingWith(Arrays.asList("los", "ange"));
List results=repository.findbyautompletestartingwith(Arrays.asList(“los”、“ange”);
很好
感谢Christoph提供了一个答案:我明白了抛出异常的原因。那么,我该如何提出两个词(或三个…等等)的问题呢?正如我所说的,有了这个电话,你就没有了。显然,我没有访问
findbyautompletestartingwith
的权限,但它似乎没有提供这种功能。除了该调用之外,您还可以使用…创建通配符短语查询,或者更好的方法是,将字段索引为关键字,并使用标准前缀(或可能的通配符)查询作为单个术语进行搜索。这是否合适取决于您正在搜索的内容,但听起来它可能非常适合您正在做的事情(“洛杉矶”是一个标识符,可以将其作为关键字索引)。是否可以同时按多个词和多个字段进行搜索?例如,按“标题”和“内容”字段搜索,并进行多词查询?我现在正在尝试类似于findbycontentortile(列表s1,列表s2>)
,但我遇到了一个类似于org.apache.solr.search.SyntaxError的错误:无法解析“content:[a]或title:.a*”:在第1行遇到了“]”“]”。。