我的一些同事有一个大型Java Web应用程序,它使用了一个使用Lucene Java构建的搜索系统。我想做的是有一个很好的基于HTTP的API来访问那些现有的搜索索引。我之前使用过Nutch,并且非常喜欢OpenSearch实现如何简单地将结果作为RSS获取。
我已经尝试在solrconfig.xml中设置Solr的dataDir,希望它能很好地获取现有的索引文件,但它似乎只是忽略它们。
我的主要问题是:
可以使用Solr访问在别处创建的Lucene索引吗?或者可能有更好的解决方案?
答案 0 :(得分:26)
成功!随着Pascal建议对schema.xml进行更改,我立即开始工作。谢谢!
以下是感兴趣的任何人的完整步骤:
<field name="docId" type="string" indexed="true" stored="true"/>
这只是证明它可以工作的证明。显然,还有很多配置需要完成。
答案 1 :(得分:11)
我从未尝试过这个,但您必须调整schema.xml以包含Lucene索引中文档的所有字段,因为如果不是,Solr将不允许您搜索字段在schema.xml中定义。
对schema.xml的调整还应包括定义查询时分析器以在您的字段中正确搜索,尤其是在使用自定义分析器索引的字段时。
在solrconfig.xml中,您可能需要更改indexDefaults和mainIndex部分中的设置。
但我很乐意阅读实际做过的人的答案。
答案 2 :(得分:1)
最后的三个步骤:
对于那些刚接触Solr的人,我有学习笔记here,像我一样:) 要自己生成一些lucene索引,可以使用我的代码here。
public class LuceneIndex {
private static Directory directory;
public static void main(String[] args) throws IOException {
long startTime = System.currentTimeMillis();
// open
Path path = Paths.get("/tmp/myindex/index");
directory = new SimpleFSDirectory(path);
IndexWriter writer = getWriter();
// index
int documentCount = 10000000;
List<String> fieldNames = Arrays.asList("id", "manu");
FieldType myFieldType = new FieldType();
myFieldType.setIndexOptions(IndexOptions.DOCS_AND_FREQS);
myFieldType.setOmitNorms(true);
myFieldType.setStored(true);
myFieldType.setTokenized(true);
myFieldType.freeze();
for (int i = 0; i < documentCount; i++) {
Document doc = new Document();
for (int j = 0; j < fieldNames.size(); j++) {
doc.add(new Field(fieldNames.get(j), fieldNames.get(j) + Integer.toString(i), myFieldType));
}
writer.addDocument(doc);
}
// close
writer.close();
System.out.println("Finished Indexing");
long estimatedTime = System.currentTimeMillis() - startTime;
System.out.println(estimatedTime);
}
private static IndexWriter getWriter() throws IOException {
return new IndexWriter(directory, new IndexWriterConfig(new WhitespaceAnalyzer()));
}
}
答案 3 :(得分:0)
I am trying the same steps with HDF as the home directory and locktype as HDFS but no luck. I see the below error
labs_shard1_replica1: org.apache.solr.common.SolrException:org.apache.solr.common.SolrException: Index dir 'hdfs://127.0.0.1/user/solr/labs/core_node1/data/index/' of core 'labs_shard1_replica1' is already locked. The most likely cause is another Solr server (or another solr core in this server) also configured to use this directory; other possible causes may be specific to lockType: hdfs
solar dir config
<directoryFactory name="DirectoryFactory"
类=#&34; $ {solr.directoryFactory:solr.NRTCachingDirectoryFactory}&#34;&GT;
但不是HDFS,如下所示
<directoryFactory name="DirectoryFactory" class="solr.HdfsDirectoryFactory">
<str name="solr.hdfs.home">hdfs://127.0.0.1/user/solr</str>
<bool name="solr.hdfs.blockcache.enabled">true</bool>
<int name="solr.hdfs.blockcache.slab.count">1</int>
<bool name="solr.hdfs.blockcache.direct.memory.allocation">false</bool>
<int name="solr.hdfs.blockcache.blocksperbank">16384</int>
<bool name="solr.hdfs.blockcache.read.enabled">true</bool>
<bool name="solr.hdfs.blockcache.write.enabled">false</bool>
<bool name="solr.hdfs.nrtcachingdirectory.enable">true</bool>
<int name="solr.hdfs.nrtcachingdirectory.maxmergesizemb">16</int>
<int name="solr.hdfs.nrtcachingdirectory.maxcachedmb">192</int>
</directoryFactory>
锁定类型 HDFS