【问题标题】:How to create an internal search engine for objects如何为对象创建内部搜索引擎
【发布时间】:2013-10-01 02:32:58
【问题描述】:

您好,我将在我的 .cshtml 网站上创建一个内部搜索引擎。

引擎将搜索对象列表。并且将根据搜索条件返回一个列表。

返回的列表按照搜索词在对象中出现的次数以及是否在对象头部排序。

该对象有一个 headercontent 将被搜索。两者都是字符串。

我的问题是如何以最有效的方式解决这个问题,因为我正在考虑很多循环和临时列表。但这需要很多响应时间。使用二进制搜索会更好吗?如何? 或者,如果已经有一个应用程序可以做到这一点,并且允许我自己设计输出。

PS:如果有帮助,所有对象都来自数据库。

【问题讨论】:

  • headercontent 是简单的字符串属性吗?
  • 如果担心性能,最好在数据库中完成。 SQL Server 有一个全文搜索组件,可以让事情变得更简单。
  • 此外,二进制搜索将用于排序的数据 - 就像索引一样。我认为这不适用于这里。
  • 您可以通过简单的LIKEs 获取列表本身。排序可能有点困难。不知道使用(LEN(ColumnToCheck) - LEN(REPLACE(ColumnToCheck,"theSearchTerm","")))之类的东西在数据库端进行排序(你只希望它用于排序,如果你想要实际出现的次数,你需要除以LEN("theSearchTerm"))会比排序更快像Regex.Matches(ColumnToCheck, "theSearchTerm").Count 这样的应用程序端。
  • 是的。两个属性都是字符串

标签: c# list search object razor


【解决方案1】:

我不习惯 razor 或 ASP.net,但在 C# 中使用对象列表,可以根据您的搜索模式为每个对象赋予权重并按权重对列表进行排序:

 var searchPattern = "word1|word2";
 var regex = new Regex(searchPattern);
 var search = list.Select( o => 
                        new { Weight = regex.Matches(o.Header).Count * 20 
                                     + regex.Matches(o.Content).Count * 10, 
                              Value = o})
                  .OrderByDescending(o => o.Weight);

如果您在数据库中有对象,这可以重写为 sql 查询,似乎 sql server LIKE 支持正则表达式。

【讨论】:

  • 对应的 sql 会是什么样子
  • 我试过这个,但是我把所有的对象都放进去了,这似乎是一个随机的顺序。但是,如果我只想显示包含我的搜索字词的对象列表,该怎么办
  • 我对 sql 的效率不够高,但我会尝试创建查询。如果你想只显示带有单词的对象添加 .Where(o => o.Weight>0)
  • 有效!好的。对于像我这样的其他菜鸟,我会补充一点,Regex 需要 namespace System.Text.RegularExpressionsRegex.Matches 区分大小写^^
猜你喜欢
  • 1970-01-01
  • 2018-02-24
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
相关资源
最近更新 更多