C# 使用linq实时搜索多个数据库字段
我基本上是在寻找一个“谷歌式”的数据库搜索 我目前正在创建一个应用程序,用于存储书籍(和作者)、游戏电影(以及未来的更多内容)。显然,应用程序还需要能够在数据库中快速搜索这些项目 当然,简单地分割游戏、书籍和电影搜索是没有问题的,不过如果我有一个搜索字段来搜索所有内容,我会觉得非常棒,主要是因为我有时会把书籍和电影xD混淆起来 现在,一开始我认为这是一个很好的方法(只需搜索书籍): 但如果有人要打字:C# 使用linq实时搜索多个数据库字段,c#,database,linq,livesearch,C#,Database,Linq,Livesearch,我基本上是在寻找一个“谷歌式”的数据库搜索 我目前正在创建一个应用程序,用于存储书籍(和作者)、游戏电影(以及未来的更多内容)。显然,应用程序还需要能够在数据库中快速搜索这些项目 当然,简单地分割游戏、书籍和电影搜索是没有问题的,不过如果我有一个搜索字段来搜索所有内容,我会觉得非常棒,主要是因为我有时会把书籍和电影xD混淆起来 现在,一开始我认为这是一个很好的方法(只需搜索书籍): 但如果有人要打字: John Green The fault in our stars The fault in
John Green The fault in our stars
The fault in our stars - John Green
无论你能想出什么样的变化,它都会失败
我确实在这里找到了一个很好的SQL查询示例:但它是在SQL中,我不知道如何将其重新写入linq。因为数据库(将)包含数千条记录,所以我不能只做:
var total = (from b in le.Book
select new { b.ID, FullDescription = (b.Title + " " +
b.Author.FirstName + " " + b.Author.Surname) });
string[] searchArr = search.split(' ');
List<int> ids = new List<int>();
foreach(string s in searchArr)
{
ids.addRange((from t in total
where t.FullDescription.Contains(s).ToList());
}
var total=(从le.Book中的b开始)
选择新建{b.ID,FullDescription=(b.Title+“”+
b、 Author.FirstName+“”+b.Author.姓氏)});
字符串[]searchArr=search.split(“”);
列表ID=新列表();
foreach(searchArr中的字符串s)
{
ids.addRange((总计从t开始)
其中t.FullDescription.Contains(s.ToList());
}
foreach循环会使其速度过慢(我知道一定有更好的方法来创建数量可变的where语句,但我也不知道如何做到这一点)
但是的,var总计将变得巨大
当然,还有一部分是让它成为一个实时搜索,这样每次键入字符时它都会更新列表视图,所以如果我键入:“jo”
,我会得到一个带有结果的列表,然后我可以通过键入“joh”来进一步定义它
但是,查询上一次查询的结果列表还是重新查询整个数据库更好
我还需要考虑退格,因此如果有人键入了“jo”
,但想要“ja”
,我需要重新查询整个数据库,对吗
那么,做这件事的最佳实践是什么呢?我已经找到了很多类似于上面提到的例子,但我正在搜索最快的“用户证明”(也就是说,无论搜索多么奇怪,它仍然需要找到正确的结果)
我的数据库模型(仅包含书籍、作者)
另外,我不是最好的数据库设计师,所以如果你发现你会做一些不同的事情,请告诉我(还有很多东西需要学习)你问了一个非常深刻的问题,我不认为有一个“正确”的答案,但我确实认为根据你的要求和假设,有“好”和“坏”的方法
从根本上说,您正试图实现以下目标:
给定一个特定的查询字符串,您需要确定数据行R
这种排序应该是确定的
这种排序应该很容易计算
此排序应反映您的搜索字符串与R
你必须首先接受,除非我们更好地定义问题,否则这更像是一门艺术,而不是一门科学。“相关性”在这里没有很好的定义。但是,我们可以对可能相关的内容做出一些常识性假设。例如,我们可以说相关结果具有以下性质:
搜索字符串包含在R
带有搜索字符串的R
成员越多,则表示结果越相关
R
的某些成员比其他成员更重要
我们应该考虑到拼写错误/错误-即,部分匹配是有价值的
然后我们可以确定R
行的“分数”,如下所示:
R
的每个成员都会获得一个最小值为1
且没有最大值的“权重”
R
的分数等于每个成员的权重之和除以成员与查询字符串之间的“距离”
距离是根据众所周知的字符串距离度量定义的,如Levenshetin或SoundEx
例如,如果您的R
具有成员名称、说明和URL
,则可以分别对这些100
、10
和1
进行加权,并应用Levenshtein度量
这甚至还不到冰山一角,因为这是一个糟糕的算法,毫无用处。更好的方法包括交叉引用数据行的成员,根据已知词典查找成员,以及开发基于证据的结果评分模型
但是评分是将问题简化为更容易陈述的有效方法。这个主题非常广泛,有很多书和学术出版物都写过。你可能想回顾全文搜索的主题,嗯,我没有意识到这会有那么困难。关于如何获得简单的版本,我有什么想法(如mysql搜索字段方法的链接)与linq一起工作?哇,这是一个相当有趣的问题。好吧,我知道这会很困难,但我会研究一下你命名的算法,我非常喜欢深入而困难的问题和算法,所以我觉得这会很有趣,谢谢你的回答,我会不断更新我的帖子。
John Green The fault in our stars
The fault in our stars - John Green
var total = (from b in le.Book
select new { b.ID, FullDescription = (b.Title + " " +
b.Author.FirstName + " " + b.Author.Surname) });
string[] searchArr = search.split(' ');
List<int> ids = new List<int>();
foreach(string s in searchArr)
{
ids.addRange((from t in total
where t.FullDescription.Contains(s).ToList());
}