我一直在四处寻找如何将MongoDB与Solr结合使用,这里的一些问题有部分反应,但没有什么真正具体的(更像是理论).在我的应用程序中,我将在MongoDB中存储大量的文档(可能高达数亿),我想对这些文档的某些属性实现全文搜索,所以我猜Solr是最好的方法这个.
我想知道的是我应该如何配置/执行所有内容以使其具有良好的性能?现在,这就是我做的事(我知道它不是最优的):
1-在MongoDB中插入对象时,我将其添加到Solr
SolrServer server = getServer();
SolrInputDocument document = new SolrInputDocument();
document.addField("id", documentId);
...
server.add(document);
server.commit();
Run Code Online (Sandbox Code Playgroud)
2-当更新对象的属性时,由于Solr不能只更新一个字段,首先我从MongoDB中检索对象然后用对象和新属性的所有属性更新Solr索引并执行类似的操作
StreamingUpdateSolrServer update = new StreamingUpdateSolrServer(url, 1, 0);
SolrInputDocument document = new SolrInputDocument();
document.addField("id", documentId);
...
update.add(document);
update.commit();
Run Code Online (Sandbox Code Playgroud)
3-查询时,首先查询Solr,然后在检索文档列表时,SolrDocumentList我会查看每个文档,并且:
4-删除时,我还没有完成那部分,并且不确定如何在Java中完成
那么有人建议如何以更有效的方式为这里描述的每个场景做到这一点?喜欢这样做的过程,当在Solr中有大量文档并一次添加一个文档时,它不会花费1小时来重建索引?我的要求是用户可能希望一次添加一个文档,我希望他们能够立即检索它
我在这里跟随了solr wiki文章,建议几乎到了T:http://wiki.apache.org/solr/Suggester.我的solrconfig.xml中有以下xml:
<searchComponent class="solr.SpellCheckComponent" name="suggest">
<lst name="spellchecker">
<str name="name">suggest</str>
<str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
<str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>
<str name="field">description</str>
<float name="threshold">0.05</float>
<str name="buildOnCommit">true</str>
</lst>
</searchComponent>
<requestHandler class="org.apache.solr.handler.component.SearchHandler" name="/suggest">
<lst name="defaults">
<str name="spellcheck">true</str>
<str name="spellcheck.dictionary">suggest</str>
<str name="spellcheck.onlyMorePopular">true</str>
<str name="spellcheck.count">5</str>
<str name="spellcheck.collate">true</str>
</lst>
<arr name="components">
<str>suggest</str>
</arr>
</requestHandler>
Run Code Online (Sandbox Code Playgroud)
但是,当我运行以下查询(或类似的东西)时:
../suggest/?q=barbequ
Run Code Online (Sandbox Code Playgroud)
我只得到以下结果xml:
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">78</int>
</lst>
<lst name="spellcheck">
<lst name="suggestions"/>
</lst>
</response>
Run Code Online (Sandbox Code Playgroud)
如您所见,这不是很有帮助.有什么建议可以解决这个问题?
我使用 Solr 3.3.0与Tomcat 6.0.26.我能够成功安装Solr,甚至可以使用http:/ localhost:8084/solr/admin访问其Web界面.
现在我想使用它的dataimporthandler来索引我的数据库中的数据.我已经在我的solrconfig中添加了以下内容:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImport
Handler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
Run Code Online (Sandbox Code Playgroud)
我还在同一目录中创建了一个data-config.xml.
我的solrconfig文件具有dataimport的以下位置
<lib dir="../../dist/" regex="apache-solr-dataimporthandler-\d.*\.jar" />
Run Code Online (Sandbox Code Playgroud)
我已检查dataimporthandler.jar文件是否存在于dist文件夹中的以下路径C:\ web\solr\example\lib\apache-solr-3.3.0\dist
但每当我键入http:/ localhost:8084/solr/dataimport或http:/ localhost:8084/solr/admin/dataimport时,它表示资源不可用.我认为这是Tomcat设置的一些问题所以我停止了tomcat并尝试使用java -jar start.jar从cmd启动Solr.我得到以下错误
HTTP ERROR 500
Problem accessing /solr/. Reason:
Severe errors in solr configuration.
Check your log files for more detailed information on what may be wrong.
If you want solr to continue after configuration errors, change:
<abortOnConfigurationError>false</abortOnConfigurationError>
in solr.xml
-------------------------------------------------------------
org.apache.solr.common.SolrException: Error loading class
'org.apache.solr.handler.dataimport.DataImportHandler'
at org.apache.solr.core.SolrResourceLoader.findClass(SolrResourceLoader.java:389)
at org.apache.solr.core.SolrCore.createInstance(SolrCore.java:423)
at org.apache.solr.core.SolrCore.createRequestHandler(SolrCore.java:459) …Run Code Online (Sandbox Code Playgroud) 我执行了一些查询,如"地址:杰克*".它显示numFound = 5214并在结果页面中显示100个文档(我将默认显示结果从10更改为100).我怎样才能获得所有文件.
提前致谢...
在我的SOLR中有日期字段(published_date),值的格式为"2012-09-26T10:08:09.123Z"
我如何通过简单的输入搜索,如"2012-09-10"而不是完整的ISO日期格式.
SOLR有可能吗?我试过了
fq=[2012-09-24%20TO%20NOW]
它应该通过过滤结果大于发布日期2012-09-24并且小于NOW返回.
但它返回的数据与2012-09-23的发布日期相同,如下所示
<float name="score">2.8183863</float>
<str name="name">Local Team Inspires Obama</str>
<date name="published_date">2012-09-23T07:44:53.123Z</date>
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
提前致谢.
我试图允许搜索Solr中的部分字符串,所以如果有人搜索"ppopota",他们会得到与搜索"hippopotamus"相同的结果.我上下阅读文档,觉得我已经筋疲力尽了.到目前为止,我有以下内容:
定义新字段类型:
<fieldtype name="testedgengrams" class="solr.TextField">
<analyzer>
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
</analyzer>
</fieldtype>
Run Code Online (Sandbox Code Playgroud)
定义"testsgengrams"类型的字段:
<field name="text_ngrams" type="testedgengrams" indexed="true" stored="false"/>
Run Code Online (Sandbox Code Playgroud)
将text_ngrams的内容复制到文本中:
<copyField source="text_ngrams" dest="text"/>
Run Code Online (Sandbox Code Playgroud)
唉,这不起作用.我错过了什么?
我使用Solr下载附带的默认Jetty服务器在我的Ubuntu机器上运行了一个Solr实例.每当我开始使用Solr时
java -jar start.jar
服务器启动正常但总是抛出一个异常:
INFO: SolrDispatchFilter.init() done
Apr 12, 2012 2:01:56 PM org.apache.solr.common.SolrException log
SEVERE: org.apache.solr.common.SolrException: undefined field text
Run Code Online (Sandbox Code Playgroud)
正如我所说,服务器仍将启动,我可以看到Solr管理界面.我定义了我的架构如下.
<fields>
<field name="id" type="string" indexed="true" stored="true" />
<field name="phraseID" type="int" indexed="true" stored="true" />
<field name="translation" type="string" indexed="true" stored="true" />
</fields>
<uniqueKey>id</uniqueKey>
Run Code Online (Sandbox Code Playgroud)
我还能够执行JSON更新 - 我提交了一个被接受的示例数据数组.到目前为止,一切都很好.
当我尝试运行查询时:
http://localhost:8983/solr/select/?q=*:*&version=2.2&start=0&rows=10&indent=on
Run Code Online (Sandbox Code Playgroud)
它正确地返回我之前在示例中提交的所有数据.
但是,当我尝试使用文本查询时,我收到HTTP错误404.
http://localhost:8983/solr/select/?q=fruit&version=2.2&start=0&rows=10&indent=on
--- returns ---
HTTP ERROR 400
Problem accessing /solr/select/. Reason:
undefined field text
Powered by Jetty://
Run Code Online (Sandbox Code Playgroud) 我注意到Solr 4.0为具有关系的文档引入了"join"功能.这很好,但是,我注意到http://wiki.apache.org/solr/Join给出的示例是单核,所有文档都在单个索引中.
有人知道我是否可以使用'join'作为多核心?
我很困惑和.这是我的理解
autoSoftCommit - 在autoSoftCommit之后,如果SOLR服务器出现故障,autoSoftCommit文件将丢失.
autoCommit - 对磁盘进行硬提交,并确保将所有autoSoftCommit提交写入磁盘并提交任何其他文档.
我的以下配置似乎只与autoSoftCommit一起使用.autoCommit本身似乎没有做任何提交.有什么我想念的吗?
<updateHandler class="solr.DirectUpdateHandler2">
<updateLog>
<str name="dir">${solr.ulog.dir:}</str>
</updateLog>
<autoSoftCommit>
<maxDocs>1000</maxDocs>
<maxTime>1200000</maxTime>
</autoSoftCommit>
<autoCommit>
<maxDocs>10000</maxDocs>
<maxTime>120000</maxTime>
<openSearcher>false</openSearcher>
</autoCommit>
</updateHandler>
Run Code Online (Sandbox Code Playgroud)
为什么autoCommit会自己动手?
我们需要序列化一些数据以放入solr和hadoop.
我正在评估序列化工具.
我名单中的前两位是Gson和Avro.
据我所知,Avro = Gson + Schema-In-JSON
如果这是正确的,我不明白为什么Avro如此受Solr/Hadoop的欢迎?
我在互联网上搜索了很多,但找不到一个正确的答案.
它所说的任何地方,Avro都很好,因为它存储架构.我的问题是如何处理该架构?
对于Hadoop中的非常大的对象可能是好的,其中单个对象存储在多个文件块中,使得存储每个部分的模式有助于更好地分析它.但即使在这种情况下,模式也可以单独存储,只需对其进行引用就足以描述模式.我认为没有理由为什么架构应该成为每一件作品的一部分.
如果有人可以给我一些好的用例,Avro如何帮助他们,而Gson/Jackson不能达到此目的,那将非常有帮助.
此外,Avro网站上的官方文档说我们需要为Avro提供一个架构,以帮助它生成Schema + Data.我的问题是,如果输入架构并将相同的数据发送到输出以及数据的JSON表示,那么Avro正在实现什么额外的?我可以不通过使用JSON序列化对象,添加我的输入模式并将其称为Avro来自己做吗?
我真的很困惑!