Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Solr&;自动完成;春季-多词发行_Java_Solr_Lucene_Spring Data_Spring Data Solr - Fatal编程技术网

Java 使用Solr&;自动完成;春季-多词发行

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

我已经使用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="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行遇到了“]”“]”。。