gpt4 book ai didi

c# - 在 Lucene.NET 索引中存储关系数据

转载 作者:太空狗 更新时间:2023-10-29 21:42:20 24 4
gpt4 key购买 nike

我目前正在尝试在大型数据库上实现基于 Lucene.NET 的搜索,但我在尝试对本质上是关系数据的内容进行搜索时遇到了障碍。

在高层次上,我尝试搜索的数据是分组的,每个项目属于 1 到 3 个组。然后我需要能够搜索组组合中的所有项目(例如:每个项目都属于 A 组和 B 组)。

这些分组中的每一个都有我正在搜索的数据中存在的 ID 和描述,但描述可能是彼此的子字符串(例如:一个名为“Stuff”的组和另一个名为“Other stuff”的组),并且我不想匹配具有我要查找的子字符串的类别。

我一直在考虑在不进行这种过滤的情况下提取数据,然后过滤 ID,但出于性能原因,我打算对从 Lucene 返回的数据进行分页。我还考虑过将 ID 以空格分隔并在该字段上进行文本搜索,但这似乎完全是 hack...

有谁知道如何在 Lucene.NET 中最好地处理这种搜索? (在有人说我使用了错误的工具之前澄清一下,这只是包括全文搜索在内的一组更大的过滤器的一个子集。如果您仍然认为我使用了错误的工具,尽管我很乐意听听正确的是什么)

最佳答案

我在 Lucene 中存储关系数据时遇到过一些问题,但您遇到的问题应该很容易解决。

我猜你标记了组字段,这样就可以在字段值中搜索子字符串。只需添加未标记化的字段,它就会按预期工作。

请检查以下一小段代码:

internal class Program {
private static void Main(string[] args) {
var directory = new RAMDirectory();
var writer = new IndexWriter(directory, new StandardAnalyzer());
AddDocument(writer, "group", "stuff", Field.Index.UN_TOKENIZED);
AddDocument(writer, "group", "other stuff", Field.Index.UN_TOKENIZED);
writer.Close(true);

var searcher = new IndexSearcher(directory);
Hits hits = searcher.Search(new TermQuery(new Term("group", "stuff")));

for (int i = 0; i < hits.Length(); i++) {
Console.WriteLine(hits.Doc(i).GetField("group").StringValue());
}
}

private static void AddDocument(IndexWriter writer, string name, string value, Field.Index index) {
var document = new Document();
document.Add(new Field(name, value, Field.Store.YES, index));
writer.AddDocument(document);
}
}

该示例将两个未标记化的文档添加到索引中,搜索内容并获得一次匹配。如果您更改代码以将它们标记化,那么您将获得两次点击,如您现在所见。

将 Lucene 用于关系数据的问题在于,可能期望通配符和范围搜索始终有效。如果由于 Lucene 解析这些查询的方式而导致索引很大,则情况并非如此。

另一个示例来说明该行为:

    private static void Main(string[] args) {
var directory = new RAMDirectory();
var writer = new IndexWriter(directory, new StandardAnalyzer());

var documentA = new Document();
documentA.Add(new Field("name", "A", Field.Store.YES, Field.Index.UN_TOKENIZED));
documentA.Add(new Field("group", "stuff", Field.Store.YES, Field.Index.UN_TOKENIZED));
documentA.Add(new Field("group", "other stuff", Field.Store.YES, Field.Index.UN_TOKENIZED));
writer.AddDocument(documentA);
var documentB = new Document();
documentB.Add(new Field("name", "B", Field.Store.YES, Field.Index.UN_TOKENIZED));
documentB.Add(new Field("group", "stuff", Field.Store.YES, Field.Index.UN_TOKENIZED));
writer.AddDocument(documentB);
var documentC = new Document();
documentC.Add(new Field("name", "C", Field.Store.YES, Field.Index.UN_TOKENIZED));
documentC.Add(new Field("group", "other stuff", Field.Store.YES, Field.Index.UN_TOKENIZED));
writer.AddDocument(documentC);

writer.Close(true);

var query1 = new TermQuery(new Term("group", "stuff"));
SearchAndDisplay("First sample", directory, query1);

var query2 = new TermQuery(new Term("group", "other stuff"));
SearchAndDisplay("Second sample", directory, query2);

var query3 = new BooleanQuery();
query3.Add(new TermQuery(new Term("group", "stuff")), BooleanClause.Occur.MUST);
query3.Add(new TermQuery(new Term("group", "other stuff")), BooleanClause.Occur.MUST);
SearchAndDisplay("Third sample", directory, query3);
}

private static void SearchAndDisplay(string title, Directory directory, Query query3) {
var searcher = new IndexSearcher(directory);
Hits hits = searcher.Search(query3);
Console.WriteLine(title);
for (int i = 0; i < hits.Length(); i++) {
Console.WriteLine(hits.Doc(i).GetField("name").StringValue());
}
}

关于c# - 在 Lucene.NET 索引中存储关系数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1760576/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com