如何使用Solrj确定Solr索引中的文档总数?
经过几个小时的搜索,我实际上有一个答案(如下所示); 我只发布这个问题,以便其他人可以更轻松地找到解决方案.
我想使用schema.xml而不是托管架构,因此我将solrconfig.xml中的以下内容更改为以下内容
<schemaFactory class="ManagedIndexSchemaFactory">
<bool name="mutable">true</bool>
<str name="managedSchemaResourceName">managed-schema</str>
</schemaFactory>
Run Code Online (Sandbox Code Playgroud)
至
<schemaFactory class="ClassicIndexSchemaFactory"/>
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用post命令索引平面文件时,我得到indexschema不是可变错误.
Solr 4 beta已经发布,GA版本将很快推出.部分文档更新已经存在了一段时间,如下所述:http://solr.pl/en/2012/07/09/solr-4-0-partial-documents-update/
但是,我还没想出如何用solrj api做到这一点.
有谁知道solrj是否可行?或者solrj是不是没有达到这个功能的速度?
更新:正如我在邮件列表中所描述的那样(请参阅此处的回复),我发现在solrj api中,SolrInputField的值可以是一个映射 - 它不必是一个简单的标量值.如果是地图,solrj会update在字段的xml元素中添加一个附加属性.例如,这段代码:
SolrInputDocument doc = new SolrInputDocument();
Map<String, String> partialUpdate = new HashMap<String, String>();
partialUpdate.put("set", "foo");
doc.addField("id", "test_123");
doc.addField("description", partialUpdate);
Run Code Online (Sandbox Code Playgroud)
产生这个文件:
<doc boost="1.0">
<field name="id">test_123</field>
<field name="description" update="set">foo</field>
</doc>
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我为这个附加属性使用了"set"这个词,但它不起作用.Solr不像我预期的那样更新字段.根据此链接:http: //solr.pl/en/2012/07/09/solr-4-0-partial-documents-update/ 有效值为"set"和"add".
任何的想法?
我正在为我的solr-indexer应用程序编写一些测试.在测试最佳实践之后,我想编写代码自我依赖,只需加载schema.xml和solrconfig.xml为索引搜索测试创建临时数据树.由于应用程序大部分是用java编写的,我正在处理SolrJ库,但是我遇到了问题(好吧,我在corecontainers的核心容器中丢失了 - coredescriptor-coreconfig-solrcore ...)任何人都可以放在这里用于创建加载配置的嵌入式服务器以及写入参数化数据目录的代码?
我的文档看起来像这样:
{attr_a: 1}, {attr_a: 2, changes_user1_a: 3}
Run Code Online (Sandbox Code Playgroud)
第二个文档说user1进行了一项尚未"提交"且其他用户无法看到的更改.
这些字段是动态的:
<dynamicField name="changes_*" type="string" indexed="true" stored="true"/>
<dynamicField name="attr_*" type="string" indexed="true" stored="true"/>
Run Code Online (Sandbox Code Playgroud)
问题是,user1需要考虑他的新值进行过滤,分页和排序,而其他用户需要对旧值进行过滤,分页和排序.
我想通过以下方式解决这个问题:如果user1想要按attr_a过滤和排序,我会发出一个类似的查询
fq=def(changes_user1_a, attr_a): 'somefilter'&sort=def(changes_user1_a, attr_a) asc
Run Code Online (Sandbox Code Playgroud)
但是,此方法会为fq生成以下错误:
"error":{
"metadata":[
"error-class","org.apache.solr.common.SolrException",
"root-error-class","org.apache.solr.parser.ParseException"],
"msg":"org.apache.solr.search.SyntaxError: Cannot parse 'def(changes_user1_a, attr_a): 3': Encountered \" \":\" \": \"\" at line 1, column 28.\r\nWas expecting one of:\r\n <EOF> \r\n <AND> ...\r\n <OR> ...\r\n <NOT> ...\r\n \"+\" ...\r\n \"-\" ...\r\n <BAREOPER> ...\r\n \"(\" ...\r\n \"*\" ...\r\n \"^\" ...\r\n <QUOTED> ...\r\n <TERM> ...\r\n <PREFIXTERM> ...\r\n <WILDTERM> ...\r\n <REGEXPTERM> ...\r\n …Run Code Online (Sandbox Code Playgroud) 我们使用Solr进行搜索,并将数据分片到多个核心.我们每周有一个核心数据,因此我们每周都会动态创建和删除核心.
如何查询solr服务器以获取其所有核心的列表?JavaDoc说我可以使用coreAdminHandler.getCoreContainer().getCoreNames(),但我不确定如何构建coreAdminHandler对象.
任何人都可以指点我的教程.
我对Solr的主要经验是索引CSV文件.但我找不到任何简单的说明/教程来告诉我我需要做什么来索引pdfs.
我见过这个:http://wiki.apache.org/solr/ExtractingRequestHandler
但这对我来说毫无意义.我需要安装Tika吗?
我输了 - 请帮忙
假设我们有一组名字和价格的mp3播放器.
如何编写正确的solr查询以查找具有特定名称且价格低于100 $的所有商品?
q = "(name:(ipod) AND price ???? 100.0)"
我有一个客户端程序,它生成1-50百万个Solr文档并将它们添加到Solr.
我正在使用ConcurrentUpdateSolrServer从客户端推送文档,每个请求1000个文档.
文档相对较小(少数小文本字段).
我想提高索引速度.
我试图将"ramBufferSizeMB"增加到1G,将"mergeFactor"增加到25,但没有看到任何变化.
我想知道是否有其他推荐的设置来提高Solr索引速度.
任何相关材料的链接将不胜感激.
solr ×10
solrj ×10
java ×4
lucene ×3
apache-tika ×1
search ×1
solr-cell ×1
solr4 ×1
syntax ×1
unit-testing ×1