Solr中的WildcardQuery错误
我使用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).
是否有任何补丁可以使它仅与*一起使用?还是进行这样的查询非常昂贵?
解决方案
回答
我假设使用id:*,我们只是想匹配所有文档,对不对?
我以前从未使用过solr,但是根据我的Lucene经验,在接收数据时,我们向每个文档添加了一个隐藏字段,然后当我们需要返回每条记录时,我们会在该字段中搜索字符串常量,即每条记录都一样。
如果无法根据情况添加类似的字段,则可以将RegexQuery与正则表达式一起使用,该正则表达式将匹配在id字段中找到的任何内容。
编辑:实际回答问题。我从来没有听说过可以使它正常工作的补丁,但是如果它可以使其工作得相当好,我会感到惊讶。请参阅此问题,以了解不受约束的PrefixQuery可能导致问题的原因。
回答
实际上,我一直在使用一种解决方法。我在ID后面添加了一个字符,例如:A1,A2等。
在字段中具有此类值时,可以使用查询id:A *
进行搜索
但愿发现是否存在真正的解决方案。
回答
Lucene不允许我们默认使用星号来启动WildcardQueries,因为这些查询的费用非常高,并且在大型索引上的运行速度非常非常非常慢。
如果我们使用的是Lucene QueryParser,请在其上调用setAllowLeadingWildcard(true)启用它。
如果我们希望所有文档都具有特定的字段集,那么与使用QueryParser相比,以编程方式查询或者遍历索引要好得多。我们实际上应该只使用QueryParser来分析用户输入。
回答
id:[a* TO z*] id:[0* TO 9*] etc.
我只是在lukeall上对索引执行此操作,并且它起作用了,因此它应该在使用标准查询解析器的Solr中起作用。我实际上并没有使用Solr。
在基本Lucene中,有一个很好的理由说明为什么我们永远不会查询每个文档,这是因为要查询文档,我们必须使用new indexReader(" DirectoryName")
并对它应用查询。因此,我们完全可以跳过对它的查询,并使用indexIndexer方法numDocs()获取所有文档的数量,而使用document(int n)检索任何文档。
回答
如果需要所有文档,请在*:*上进行查询
如果我们希望所有带有特定字段(例如id)的文档,请尝试id:[* TO *]
回答
如果我们只是想获取所有文档,Solr确实支持*:查询。这是我唯一知道的Solr可以让我们以开头的查询。我确定我们可能已经将其视为Solr管理员页面中的默认查询。
如果我们尝试使用作为第一个字符进行更具体的查询,例如说id:456,那么我见过的最好的方法之一就是对该字段进行两次索引。通常一次(字段名称:id),一次所有字符都反转(字段名称:reverse_id)。然后,我们实质上可以通过发送查询reverse_id:654来执行查询id:456. 希望这是有道理的。
我们也可以在http://www.mail-archive.com/[email protected]/上搜索Solr用户组邮件列表,此类问题经常出现。