Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.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
C# 使用linq实时搜索多个数据库字段_C#_Database_Linq_Livesearch - Fatal编程技术网

C# 使用linq实时搜索多个数据库字段

C# 使用linq实时搜索多个数据库字段,c#,database,linq,livesearch,C#,Database,Linq,Livesearch,我基本上是在寻找一个“谷歌式”的数据库搜索 我目前正在创建一个应用程序,用于存储书籍(和作者)、游戏电影(以及未来的更多内容)。显然,应用程序还需要能够在数据库中快速搜索这些项目 当然,简单地分割游戏、书籍和电影搜索是没有问题的,不过如果我有一个搜索字段来搜索所有内容,我会觉得非常棒,主要是因为我有时会把书籍和电影xD混淆起来 现在,一开始我认为这是一个很好的方法(只需搜索书籍): 但如果有人要打字: John Green The fault in our stars The fault in

我基本上是在寻找一个“谷歌式”的数据库搜索

我目前正在创建一个应用程序,用于存储书籍(和作者)、游戏电影(以及未来的更多内容)。显然,应用程序还需要能够在数据库中快速搜索这些项目

当然,简单地分割游戏、书籍和电影搜索是没有问题的,不过如果我有一个搜索字段来搜索所有内容,我会觉得非常棒,主要是因为我有时会把书籍和电影xD混淆起来

现在,一开始我认为这是一个很好的方法(只需搜索书籍):

但如果有人要打字:

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());
    }