我使用solr搜索文档,当尝试使用此查询“id:*
”搜索文档时,我得到此查询解析器异常,告知它无法使用*或?解析查询作为第一个角色。
HTTP Status 400 - org.apache.lucene.queryParser.ParseException: Cannot parse 'id:*': '*' or '?' not allowed as first character in WildcardQuery
type Status report
message org.apache.lucene.queryParser.ParseException: Cannot parse 'id:*': '*' or '?' not allowed as first character in WildcardQuery
description The request sent by the client was syntactically incorrect (org.apache.lucene.queryParser.ParseException: Cannot parse 'id:*': '*' or '?' not allowed as first character in WildcardQuery).
是否有任何补丁可以让它与*一起工作?或者进行这样的查询是否成本很高?
答案 0 :(得分:14)
如果您想要所有文件,请在*:*
上进行查询如果您想要所有包含特定字段(例如id)的文档,请尝试id:[* TO *]
答案 1 :(得分:6)
默认情况下,Lucene不允许您使用星号启动WildcardQueries,因为这些查询非常非常昂贵,并且在大型索引上非常非常慢。
如果您正在使用Lucene QueryParser,请在其上调用setAllowLeadingWildcard(true)以启用它。
如果您希望所有文档都设置了某个字段,那么以编程方式查询或遍历索引比使用QueryParser要好得多。您应该只使用QueryParser来解析用户输入。
答案 2 :(得分:5)
id:[a* TO z*] id:[0* TO 9*] etc.
我刚刚在我的索引上用lukeall做了这个并且它工作了,因此它应该在使用标准查询解析器的Solr中工作。我实际上并没有使用Solr。
在基础Lucene中,有一个很好的理由说明为什么你永远不会查询每个文档,这是因为查询文档时必须使用new indexReader("DirectoryName")
并对其应用查询。因此,您可以完全跳过对其应用查询并使用indexReader
方法numDocs()
来计算所有文档,并使用document(int n)
来检索任何文档。
答案 3 :(得分:4)
如果您只是想获取所有文档,Solr确实支持*:*查询。这是我唯一知道Solr会让你用*开始查询的时候。我确定您可能已将此视为Solr管理页面中的默认查询。
如果您尝试使用*作为第一个字符进行更具体的查询,例如说id:* 456,那么我见过的最好的方法之一就是将该字段编入索引两次。一旦正常(字段名称:id),并且所有字符反转一次(字段名称:reverse_id)。然后你可以通过发送查询reverse_id:654 来实际查询id: 456。希望这是有道理的。
您还可以在http://www.mail-archive.com/solr-user@lucene.apache.org/搜索Solr用户组邮件列表,此类问题经常出现。
答案 4 :(得分:2)
以下Solr问题是能够配置默认lucene查询解析器的请求。 https://issues.apache.org/jira/browse/SOLR-218
在本期中,您可以找到如何“修补”Solr的以下说明。此修改将允许您使用*。
启动查询Jonas Salk:我基本上只更新了一个Java文件:SolrQueryParser.java。
public SolrQueryParser(IndexSchema schema, String defaultField) {
...
setAllowLeadingWildcard(true);
setLowercaseExpandedTerms(true);
...
}
...
public SolrQueryParser(QParser parser, String defaultField, Analyzer analyzer) {
...
setAllowLeadingWildcard(true);
setLowercaseExpandedTerms(true);
...
}
我不确定是否需要setLowercaseExpandedTerms ...
答案 5 :(得分:1)
我假设有id:*你只是想匹配所有文件,对吗?
我以前从未使用solr,但在我的Lucene体验中,在提取数据时,我们为每个文档添加了一个隐藏字段,然后当我们需要返回每个记录时,我们会搜索字符串常量每个记录都相同的字段。
如果你不能在你的情况下添加这样的字段,你可以使用带有正则表达式的RegexQuery,它可以匹配id字段中可以找到的任何内容。
编辑:实际回答这个问题。我从来没有听说过一个可以让它发挥作用的补丁,但如果它能够合理地工作,我会感到惊讶。请参阅this question,了解无约束的PrefixQuery可能导致问题的原因。
答案 6 :(得分:1)
实际上,我一直在使用解决方法。我在id中添加了一个字符,例如:A1,A2等。
在字段中使用此类值,可以使用查询id:A*
但是很想知道是否存在真正的解决方案。