C# 在lucene搜索之前,如何通过外键筛选数据?

C# 在lucene搜索之前,如何通过外键筛选数据?,c#,.net,linq,entity-framework,lucene.net,C#,.net,Linq,Entity Framework,Lucene.net,我想在我的项目中使用Lucene搜索,因为它很快,但有一个问题 我有DB表用户和友谊。我想通过搜索表单找到用户的朋友。使用lucene,我只能通过搜索查询找到所有用户,获取他们的ID,将他们放到实体框架中,然后只获取用户的朋友,但如果系统中的用户有1000万,而该用户的朋友只有少数呢?所以我需要把用户的朋友,然后过滤他们的搜索查询。我该怎么做?我听说Linq对Lucene的事,但我不确定这是我需要的。请帮我解决我的麻烦 另外,对不起我的英语,我来自乌克兰,英语说得不好:) 我找到了解决办法。我将

我想在我的项目中使用Lucene搜索,因为它很快,但有一个问题

我有DB表用户和友谊。我想通过搜索表单找到用户的朋友。使用lucene,我只能通过搜索查询找到所有用户,获取他们的ID,将他们放到实体框架中,然后只获取用户的朋友,但如果系统中的用户有1000万,而该用户的朋友只有少数呢?所以我需要把用户的朋友,然后过滤他们的搜索查询。我该怎么做?我听说Linq对Lucene的事,但我不确定这是我需要的。请帮我解决我的麻烦

另外,对不起我的英语,我来自乌克兰,英语说得不好:)


我找到了解决办法。我将在索引中存储朋友ID,并通过这些ID查找用户朋友。这不是最好的解决方案,因为索引经常会被编辑,但我无法实现另一个想法。

这可以通过使用来实现。这是一个简短的演示,将结果限制为仅包含FriendsWith:Beta的文档。这需要重新编制索引 受更改的友谊连接影响的文档。该类可以在contrib包中找到

using System;
using System.Collections.Generic;
using Lucene.Net.Analysis;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.Search;
using Lucene.Net.Store;
using Directory = Lucene.Net.Store.Directory;
using Version = Lucene.Net.Util.Version;

namespace ConsoleApplication {
    public static class Program {
        public static void Main(string[] args) {
            var directory = new RAMDirectory();
            var analyzer = new KeywordAnalyzer();

            using (var writer = new IndexWriter(directory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED)) {
                var users = new [] { "Alfa", "Beta", "Gamma", "Delta" };
                var friendships = new Dictionary<String, String[]> {
                    { "Alfa", new [] { "Beta", "Gamma", "Delta" } },
                    { "Beta", new [] { "Gamma", "Delta" } },
                    { "Gamma", new [] { "Delta" } },
                    { "Delta", new String[0] } // Noone likes Delta.
                };

                foreach (var userName in users) {
                    var doc = new Document();
                    doc.Add(new Field("Name", userName, Field.Store.YES, Field.Index.NO));

                    foreach (var friendName in friendships[userName]) {
                        doc.Add(new Field("FriendsWith", friendName, Field.Store.NO, Field.Index.NOT_ANALYZED_NO_NORMS));
                    }

                    writer.AddDocument(doc);
                }

                writer.Commit();
            }

            // This should be the real query provided by the user (city, age, description, ...)
            var query = new MatchAllDocsQuery();

            // Create a filter limiting the result to those being friends with the current user,
            // in this example the user "Beta".
            var filter = new TermsFilter();
            filter.AddTerm(new Term("FriendsWith", "Gamma"));

            var reader = IndexReader.Open (directory, readOnly: true);
            var searcher = new IndexSearcher(reader);

            var result = searcher.Search (query, filter, 10);
            foreach(var topDoc in result.ScoreDocs) {
                var doc = searcher.Doc(topDoc.Doc);
                var foundName = doc.Get ("Name");
                Console.WriteLine("Matched user '{0}'", foundName);
            }

            Console.ReadLine();
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用Lucene.Net.Analysis;
使用Lucene.Net.Documents;
使用Lucene.Net.Index;
使用Lucene.Net.Search;
使用Lucene.Net.Store;
使用Directory=Lucene.Net.Store.Directory;
使用Version=Lucene.Net.Util.Version;
命名空间控制台应用程序{
公共静态类程序{
公共静态void Main(字符串[]args){
var directory=new RAMDirectory();
var analyzer=新关键字analyzer();
使用(var writer=new IndexWriter(目录、分析器、IndexWriter.MaxFieldLength.UNLIMITED)){
var用户=新[]{“Alfa”、“Beta”、“Gamma”、“Delta”};
var friendships=新字典{
{“Alfa”,新[]{“Beta”,“Gamma”,“Delta”},
{“Beta”,新[]{“Gamma”,“Delta”},
{“Gamma”,新[]{“Delta”},
{“Delta”,新字符串[0]}//没有人喜欢Delta。
};
foreach(用户中的var用户名){
var doc=新文档();
添加文档(新字段(“名称”、用户名、Field.Store.YES、Field.Index.NO));
foreach(friendships中的变量friendName[用户名]){
添加文档(新字段(“FriendsWith”,friendName,Field.Store.NO,Field.Index.NOT_-analysis_-NO_-NORMS));
}
writer.AddDocument(doc);
}
writer.Commit();
}
//这应该是用户提供的真实查询(城市、年龄、描述等)
var query=new MatchAllDocsQuery();
//创建一个过滤器,将结果限制为当前用户的好友,
//在本例中,用户为“Beta”。
var filter=新术语过滤器();
filter.AddTerm(新术语(“FriendsWith”、“Gamma”);
var reader=IndexReader.Open(目录,只读:true);
var searcher=新索引搜索器(读卡器);
var result=searcher.Search(查询,筛选,10);
foreach(result.ScoreDocs中的var topDoc){
var doc=searcher.doc(topDoc.doc);
var foundName=doc.Get(“名称”);
WriteLine(“匹配的用户“{0}”,foundName);
}
Console.ReadLine();
}
}
}

如果一个用户只有几个朋友,你为什么要给用户编制索引?如果我是你,我会首先尝试使用某种在线搜索(例如,获取好友列表并对其进行迭代)。你试过这样的东西吗?嗯。。。也许你是对的。但若用户有10000个朋友呢?你们的问题就不存在了,你们可以开始祈祷有人会给你们一个有用的答案。