标签: solr4

如何使用自定义处理程序/插件更新Solr服务器端的Solr文档

我有一个拥有数百万条记录的核心.
我想添加一个自定义处理程序,它扫描现有文档并根据条件更新其中一个字段(例如,年龄> 12).
我更喜欢在Solr服务器端进行操作,以避免将数百万个文档发送到客户端并返回.
我正在考虑编写一个solr插件,它将接收查询并更新查询文档中的一些字段(如查询处理程序删除).
我想知道是否有现有的解决方案或更好的替代方案.
我在网上搜索了一段时间,找不到更新文档的Solr插件示例(我不需要扩展更新处理程序).
我写了一个插件,它使用下面的代码,工作正常,但没有我需要的那么快.
目前我这样做:

AddUpdateCommand addUpdateCommand = new AddUpdateCommand(solrQueryRequest); 
DocIterator iterator = docList.iterator(); 
SolrIndexSearcher indexReader = solrQueryRequest.getSearcher(); 
while (iterator.hasNext()) { 
   Document document = indexReader.doc(iterator.nextDoc()); 
   SolrInputDocument solrInputDocument = new SolrInputDocument(); 
   addUpdateCommand.clear(); 
   addUpdateCommand.solrDoc = solrInputDocument; 
   addUpdateCommand.solrDoc.setField("id", document.get("id")); 
   addUpdateCommand.solrDoc.setField("my_updated_field", new_value); 
   updateRequestProcessor.processAdd(addUpdateCommand); 
} 
Run Code Online (Sandbox Code Playgroud)

但这是非常昂贵的,因为更新处理程序将再次获取我已经掌握的文档.
是否有一种安全的方法来更新lucene文档并将其写回来,同时考虑所有与Solr相关的代码,如缓存,额外的solr逻辑等?
我想将它转换为SolrInputDocument,然后只需通过Solr添加文档,但我需要先转换所有字段.
先谢谢,Avner

solr solr4

5
推荐指数
1
解决办法
1463
查看次数

使用功能查询在Solr中提高分数

我正在研究Solr 4,用于根据存储在Index中的受欢迎程度对我的Solr结果排名进行优化。

现在,当有人进行搜索时,除了相关性等级之外,我还想使用受欢迎度等级来影响相关性等级。最简单的公式可能是:

新的相对排名=得分*人气排名

我一直在http://wiki.apache.org/solr/FunctionQuery#product上查看Solr函数查询,以实现相同的功能,但是我不确定如何使它工作。我不知道如何使用乘积函数获得分数。试图做到这一点,我总是得到错误,因为未定义字段。

现在,我可以使用此处定义的boost 如何在solr中增强字段,但是在要使用Solr提供的功能查询的地方,我还有其他逻辑/要求。

例如,我尝试使用以下似乎有效的简单查询

http://solr:8983/solr/select?q=hp%20laptop&defType=edismax&fl=Id,Name,score&bf=product%28$v1,$v2%29&v1=Id&v2=2
Run Code Online (Sandbox Code Playgroud)

现在,对于我的实际需求,我想将分数设为$ v2,但是我找不到如何做到这一点。

非常感谢您的帮助。

lucene solr full-text-search solrnet solr4

5
推荐指数
1
解决办法
7363
查看次数

SolrCloud和需要索引重建和/或修改代码的更新

由于ZooKeeper集成,SolrCloud有一些很好的实用程序来管理重新加载核心/集合配置.

但是,这仅仅完全涵盖了微不足道的更新 - 但也有非常重要的更新.非平凡在这种情况下,意味着产生了一些变化,使一个更新的节点和/或它的芯用一些以前的状态不兼容的.

特别是,我想到了这些子类:

  1. 代码更新需要重新启动底层Solr实例.
  2. 需要完全重建核心的架构更改.

我的问题是:如何使用SolrCloud和相关的Zookeeper服务来使这些更新更容易,更可靠和/或确保更高的可用性?

注意:我希望有一些"理解"此类更新的API /功能.到目前为止,我发现最值得注意的是CoreAdmin中的集合别名,这将允许"旧"和"新"版本之间更平滑的过渡 - 考虑到上述希望,这有点令人失望.

solr solrcloud solr4 apache-zookeeper

5
推荐指数
1
解决办法
572
查看次数

数十亿文档导致Solr云性能下降

我正在尝试使用SolrCloud索引大量简单文档,并且遇到了一些性能和可伸缩性限制,并且想知道可以做些什么.

硬件方面,我有一个32节点的Hadoop集群,我用它来运行所有的Solr分片,每个节点有128GB的内存.当前的SolrCloud设置被分成4个单独的32个分片的单独云,从而每个云提供4个运行分片或每8个节点分配一个云.每个分片当前分配了6GB的堆大小.我宁愿避免增加Solr分片的堆内存,以便在集群上运行其他MapReduce作业.

我目前每天在这些云中插入的文件率在两个云中为50亿,第三个为30亿,第四个为20亿; 但是,考虑到容量,目标是扩展解决方案以支持双倍数量的文档.要为这些文档编制索引,可以运行生成Solr XML文档的MapReduce作业,然后通过SolrJ的CloudSolrServer接口提交这些文档.在测试中,我发现将每个云的活动并行插入数量限制为80可以获得最佳性能,因为任何更高的性能都会导致收益递减,这很可能是由于文档在内部不断改组为SolrCloud.从索引的角度来看,正在创建过时的集合来保存一整天的文档,并且通常插入主要发生在当天(前几天只允许搜索),并且计划最多可以保留60天(或者每个云中的集合).最繁忙的云中一个集合中的单个分片索引当前占用整个集合的30G磁盘空间或960G.文档正在自动提交,提交时间为4分钟(opensearcher = false),软提交时间为8分钟.

从搜索角度来看,用例是相当通用且简单的类型搜索:,因此无需调整系统以使用任何更高级的查询功能.因此,对我来说最重要的是使索引性能能够跟上输入的速度.

在初始负载测试中,我能够实现每天每天云计算100亿个文档的预计索引率,总计每天400亿.但是,初始负载测试是在相当空的云上完成的,只有几个小集合.现在已经有几天的文档被编入索引,一旦云在两个最大的云中达到大约15个完整集合(或每个云大约80-100亿个文档),我开始看到索引性能下降相当急剧下降.根据当前的应用程序日志记录,我发现索引性能下降了40%.因此,我担心随着更多集合的添加,性能将如何保持.

我向社区提出的问题是,是否有其他人有过以这种规模使用Solr的经验(数千亿),并且如果有人观察到索引性能随着收集数量的增加而下降.我的理解是每个集合都是一个单独的索引,因此插入率应保持不变.除此之外,还可以在SolrCloud配置中进行哪些其他调整或更改以提高索引性能的速度?我是否对Solr能够处理的事情施加了严格的限制?

lucene solr solrj solrcloud solr4

5
推荐指数
0
解决办法
1504
查看次数

SOLR:solrQuery.addDateRangeFacet():无法将空间%2B1DAY添加到字段的值:

我正在尝试查询数据(使用solr)并获得一天的粒度计数.

我遇到以下代码问题:

    solrQuery.addDateRangeFacet("startTimeISO", date1.toDate(), date2.toDate(), "%2B1DAY");

    solrQuery.setQuery(queryString);

    QueryResponse response = null;
    try {
        response = solrClient.getSolrServer(getCollectionName(Constants.WebPeerAnomaliesModelTuple()._1())).query(solrQuery);
    } catch (Exception exp) {
        LOGGER.error("Failed to get facet results: ", exp);
    }
Run Code Online (Sandbox Code Playgroud)

我在这里得到的错误是:

"不能将差距%2B1DAY添加到价值2014年11月14日06:37:30太平洋标准时间2014年字段:startTimeISO"

有人可以帮我解决这个问题吗?

我不确定为什么"%2B1DAY"会失败.当我从浏览器中执行相同操作时,我得到了正确的结果.如果我从url查询下面的内容,它可以工作:/select?facet = true&facet.date = startTimeISO&facet.date.start = NOW/DAY-30DAYS&facet.date.end = NOW/DAY%2B1DAY&facet.date.gap =%2B1DAY

如果我问一个微不足道的问题,请道歉.我还在尝试调试这个.任何指针都会有所帮助.谢谢.

更新:解决方案:

我能够调试这个并找出我收到此错误的原因.

在我的Java代码中,我应该添加"+ 1Day"而不是"%2B1DAY".通过浏览器查询工作因为+是%2B(网址编码)抱歉这个愚蠢的问题.希望它可以帮助某人.:)

solr4

5
推荐指数
1
解决办法
1720
查看次数

Liferay 6.2-ce-ga2 clustering issue

Liferay 6.2-ce-ga2

I'm trying to cluster two nodes, I'm using tomcat liferay bundle for both the nodes.

I used the following blog post as a reference and many others https://dev.liferay.com/discover/portal/-/knowledge_base/6-1/liferay-clustering

Both the nodes starts up as expected but they are not in sync. I dont have any errors on my console. I used the direct URL to login to a particular node and say, added an organization or published a web content article, which is not getting reflected when i …

solr ehcache liferay liferay-6 solr4

5
推荐指数
1
解决办法
1008
查看次数

如何在solr 4.8中获得一个字段的总和

这是我的回复数据:

"response": {
    "numFound": 2,
    "start": 0,
    "docs": [
    {
      "total_amount": 10,
      "id": "2"
    },
    {
      "total_amount": 10,
      "id": "1"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我想得到total_amount的总和.我也试过了facet查询.但我没有得到总和.我有一些博客,但这是针对solr 5.1.http://yonik.com/solr-facet-functions/

java lucene solr facets solr4

5
推荐指数
1
解决办法
3769
查看次数

通过Solr API编写/更新Solr的外部字段文件

是否可以通过某些API为Solr写入外部文件(包含外部文件字段)?

我试图找到Solr文档,但找不到任何有帮助的东西!

请根据要求提供更多详细信息。

我正在做一个项目,该项目中很少有详细信息,这些详细信息非常频繁地存储在外部文件中,与以下问题完全相同:如何在solr中读写外部文件字段?

在对Solr执行搜索查询时,我们将该字段用于某些功能查询和排序目的。这很好。

但是,此文件必须位于Solr Data目录中。因此它位于Solr的安装位置。现在考虑我的情况,我的主应用程序位于其他Windows Server上,并通过SolrNet与Solr通信。但是我的Solr实例位于专用于Solr的远程计算机上。

我的问题是:

  1. 如何从Windows计算机(实际上是一台单独的计算机)上托管的asp.net应用程序将该文件传输/写入到Solr Server。
  2. Solr内置有什么方法/ API,可以从其API之一创建/更新此文件吗?

始终欢迎其他任何建议。

solr solrnet solrj solr4

5
推荐指数
0
解决办法
162
查看次数

Solr Replication和Solr Cloud有什么区别?

我支持rails项目,它包含rails app和Solr的附加实例.

我的环境:rails 3.2.1,ruby 2.1.2,sunspot 2.1.0,Solr 4.1.6.

问题:

Clould提供商不稳定.我不能使用其他云提供商 - 这是客户的需求.通常,搜索服务器继续维护,Web应用程序停止生产.因此,我考虑如何制作2个相同的搜索服务器而不是一个,以使系统更稳定:如果一个服务器将关闭,其他服务器将继续工作.

摆脱困境的方法:

题:

  1. 怎么办?为什么?
  2. SolrCloud是更好的解决方案吗?
  3. 这些变体的PROC和CONS是什么?
  4. 在哪些情况下更好地应对SolrCloud?
  5. 在哪些情况下更好地处理Solr Replication?

replication solr sunspot-solr solrcloud solr4

4
推荐指数
1
解决办法
1042
查看次数

SolrCloud与SSL和基本身份验证

是否可以使用SSL和基本身份验证配置SolrCloud?

我使用以下方法在SolrCloud中使用SSL配置了3个Solr节点:https://cwiki.apache.org/confluence/display/solr/Enabling+SSL

我在此之后添加了身份验证和授权:https: //cwiki.apache.org/confluence/display/solr/Basic+Authentication+Plugin,https://cwiki.apache.org/confluence/display/solr/Rule-基于+授权+插件

当只启用SSL时,它可以工作.

当只启用身份验证+授权时,它可以工作

当两者都启用时,我会在启动时获得以下堆栈跟踪:

2016-06-01 17:19:41.933 INFO  (OverseerStateUpdate-168013962670440512-172.30.92.66:8983_solr-n_0000000079) [   ] o.a.s.c.o.ZkStateWriter going to update_collection /collections/testowa/state.json version: 1350
2016-06-01 17:19:41.935 INFO  (zkCallback-4-thread-1-processing-n:172.30.92.66:8983_solr) [   ] o.a.s.c.c.ZkStateReader A cluster state change: [WatchedEvent state:SyncConnected type:NodeDataChanged path:/collections/testowa/state.json] for collection [testowa] has occurred - updating... (live nodes size: [3])
2016-06-01 17:19:41.937 INFO  (zkCallback-4-thread-1-processing-n:172.30.92.66:8983_solr) [   ] o.a.s.c.c.ZkStateReader Updating data for [testowa] from [1350] to [1351]
2016-06-01 17:19:43.557 INFO  (coreZkRegister-1-thread-1-processing-n:172.30.92.66:8983_solr x:testowa_shard1_replica3 s:shard1 c:testowa r:core_node1) [c:testowa s:shard1 r:core_node1 x:testowa_shard1_replica3] o.a.s.c.ShardLeaderElectionContext …
Run Code Online (Sandbox Code Playgroud)

ssl solr basic-authentication solrcloud solr4

4
推荐指数
1
解决办法
3027
查看次数