Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用和跨多个索引搜索Lucene_Lucene_Lucene.net - Fatal编程技术网

使用和跨多个索引搜索Lucene

使用和跨多个索引搜索Lucene,lucene,lucene.net,Lucene,Lucene.net,我有多个索引,可以独立搜索每个索引,但我希望对所有索引进行合并搜索。我看过好几篇文章推荐使用multireader,但我没有得到我想要的结果。有关更多详细信息,请参见下面的单元测试 [测试] 给定公共无效\u多个\u文档\u具有\u SameId\u Diff\u属性\u Expect\u Matches() { //安排 var source1=new[]{new Stub(“1”,“Car”)、new Stub(“2”,“Bike”)、new Stub(“3”,“Car”)}; var so

我有多个索引,可以独立搜索每个索引,但我希望对所有索引进行合并搜索。我看过好几篇文章推荐使用multireader,但我没有得到我想要的结果。有关更多详细信息,请参见下面的单元测试

[测试]
给定公共无效\u多个\u文档\u具有\u SameId\u Diff\u属性\u Expect\u Matches()
{
//安排
var source1=new[]{new Stub(“1”,“Car”)、new Stub(“2”,“Bike”)、new Stub(“3”,“Car”)};
var source2=new[]{新存根(“1”、“福特”)、新存根(“3”、“杜卡迪”)、新存根(“4”、“本田”)};
var idField=“Id”;
var searchField=“全文”;
var directory1=CreateRAMDirectory(source1、idField、searchField);
var directory2=CreateRAMDirectory(source2,idField,searchField);
//表演
var reader=IndexReader.Open(directory1,true);
var reader2=IndexReader.Open(directory2,true);
var results=新列表();
使用(IndexSearcher=new IndexSearcher(新的多读卡器(读卡器,读卡器2)))
{
使用(Analyzer Analyzer=new StandardAnalyzer(Lucene.Net.Util.Version.Lucene_30))
{
var queryParser=新的多字段queryParser(Lucene.Net.Util.Version.Lucene_30,新[]{“全文”},分析器)
{
AllowReadingWildcard=true
};
var query=queryParser.Parse(“汽车和福特”);
var collector=TopScoreDocCollector.Create(1000,true);
searcher.Search(查询、收集器);
var matches=collector.TopDocs().ScoreDocs;
foreach(匹配项中的变量项)
{
var id=item.Doc;
var doc=searcher.doc(id);
var行=单据获取(“Id”);
结果。添加(行);
}
}
}
//断言
areevalent(新的[]{“1”},results.Distinct().ToArray());
}
以下是存根和帮助器方法定义

公共类存根
{
公共存根(字符串id、字符串属性)
{
Id=Id;
Attrib=Attrib;
}
公共字符串Id{get;}
公共字符串属性{get;}
}
私有静态RAMDirectory CreateRAMDirectory(存根[]源1,字符串idField,字符串searchField)
{
var directory=new RAMDirectory();
使用(Analyzer Analyzer=new StandardAnalyzer(Lucene.Net.Util.Version.Lucene_30))
使用(var writer=new IndexWriter(目录、分析器、new IndexWriter.MaxFieldLength(1000)))
{
foreach(source1中的var行)
{
var document=新文档();
document.Add(新字段(idField,row.Id,Field.Store.YES,Field.Index.NO));
Add(新字段(searchField,$“{row.Attrib}”,Field.Store.YES,Field.Index.analysisd));
编写者。添加文档(文档);
}
writer.Optimize();
writer.Flush(真的,真的,真的);
}
返回目录;
}

乍一看,您正在编制索引的任何文档似乎都不包含“Car”和“Ford”。查询
Car和Ford
需要任何匹配的文档同时包含这两个文档。是的,我想在文档之间搜索,就像它们是一个文档一样(相同的Id字段)。我明白多读卡器是实现这一目标的方法。如果不是,那么在文档以这种方式分区的情况下,是否有其他方法来实现这一点?不,Multireader不会这样做。它只是允许您搜索多个索引。您所说的基本上是关系连接。这篇博文讨论了BlockJoinQuery的使用:乍一看,您正在索引的文档中似乎没有同时包含“Car”和“Ford”。查询
Car和Ford
需要任何匹配的文档同时包含这两个文档。是的,我想在文档之间搜索,就像它们是一个文档一样(相同的Id字段)。我明白多读卡器是实现这一目标的方法。如果不是,那么在文档以这种方式分区的情况下,是否有其他方法来实现这一点?不,Multireader不会这样做。它只是允许您搜索多个索引。您所说的基本上是关系连接。这篇博文介绍了BlockJoinQuery的使用: