[英]How do you implement a custom filter with Lucene.net?
下面的代碼來自Lucene In Action一書(最初是Java)。 它用於構建“允許”文檔列表(從用戶權限的角度來看)以過濾搜索結果。 問題是termsDocs.Read()方法不接受通過引用傳遞的'doc'和'freq'數組,因此在設置位數組中的位時它們仍然是空的。
任何人都可以提供幫助,使用Lucene自定義過濾器(尤其是.net)的例子似乎很薄。 謝謝。
public class LuceneCustomFilter : Lucene.Net.Search.Filter
{
string[] _luceneIds;
public LuceneCustomFilter(string[] luceneIds)
{
_luceneIds = luceneIds;
}
public override BitArray Bits(Lucene.Net.Index.IndexReader indexReader)
{
BitArray bitarray = new BitArray(indexReader.MaxDoc());
int[] docs = new int[1];
int[] freq = new int[1];
for (int i = 0; i < _luceneIds.Length; i++)
{
if (!string.IsNullOrEmpty(_luceneIds[i]))
{
Lucene.Net.Index.TermDocs termDocs = indexReader.TermDocs(
new Lucene.Net.Index.Term(@"luceneId", _luceneIds[i]));
int count = termDocs.Read(docs, freq);
if (count == 1)
{
bitarray.Set(docs[0], true);
}
}
}
return bitarray;
}
}
我正在使用Lucene.net 2.0.0.4,但TermDocs界面在最新的分支中看起來仍然相同: https ://svn.apache.org/repos/asf/incubator/lucene.net/trunk/C %23 / src目錄/ Lucene.Net /索引/ TermDocs.cs
以下是使用自定義過濾器的Lucene.NET的工作示例,您可以查看:
using System;
using System.Collections;
using Lucene.Net.Analysis;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.Search;
using Lucene.Net.Store;
class Program
{
static void Main(string[] args)
{
Directory index = new RAMDirectory();
Analyzer analyzer = new KeywordAnalyzer();
IndexWriter writer = new IndexWriter(index, analyzer, true);
Document doc = new Document();
doc.Add(new Field("title", "t1", Field.Store.YES,
Field.Index.TOKENIZED));
writer.AddDocument(doc);
doc = new Document();
doc.Add(new Field("title", "t2", Field.Store.YES,
Field.Index.TOKENIZED));
writer.AddDocument(doc);
writer.Close();
Searcher searcher = new IndexSearcher(index);
Query query = new MatchAllDocsQuery();
Filter filter = new LuceneCustomFilter();
Sort sort = new Sort("title", true);
Hits hits = searcher.Search(query, filter, sort);
IEnumerator hitsEnumerator = hits.Iterator();
while (hitsEnumerator.MoveNext())
{
Hit hit = (Hit)hitsEnumerator.Current;
Console.WriteLine(hit.GetDocument().GetField("title").
StringValue());
}
}
}
public class LuceneCustomFilter : Filter
{
public override BitArray Bits(IndexReader indexReader)
{
BitArray bitarray = new BitArray(indexReader.MaxDoc());
int[] docs = new int[1];
int[] freq = new int[1];
TermDocs termDocs = indexReader.TermDocs(
new Term(@"title", "t1"));
int count = termDocs.Read(docs, freq);
if (count == 1)
{
bitarray.Set(docs[0], true);
}
return bitarray;
}
}
這里有點困惑,因為傳遞數組確實通過引用傳遞它。 例如,下面的blurb將打印10 10 10 10 10,表明數組值已更新。
我在這里錯過了什么嗎?
public void TestPassing()
{
int[] stuff = new int[] {5, 5, 5, 5};
Add(stuff, 5);
for (int i = 0; i < stuff.Length; i++)
{
Console.Write(stuff[i]);
}
}
public void Add(int[] stuff, int x)
{
for(int i = 0; i < stuff.Length; i++)
{
stuff[i] = stuff[i] + x;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.