- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 C# 中创建了一个列出组织的 .net MVC 应用程序,目前数据库 (SQLServer) 中有 6000 条记录。组织表中的字段是:
当前的搜索是使用 linq 完成的,例如:
iList<Organisation> orglist = myOrgs.Where(x => x.Title.Contains('abc') ||
x.ContactPerson.Contains('abc') ||
x.Details.Contains('abc') ||
x.Keywords.Contains('abc'))
.OrderBy(x => x.Title).ToList();
然后结果按标题排序。哪个不合适。
如果有人搜索“Alcohol Support”,我希望将上述结果放在列表的顶部。
我希望结果按以下顺序排列:
正在寻找有关实现此功能的最佳方法的建议,或者是否有人知道已经在执行此操作的任何算法/库?
** 更新 **我现在正在寻找一个更简单的解决方案,请参阅此链接:
最佳答案
需求
对于每个需求,我们将执行 SQL 调用
我们将仅返回行 ID 的每个 SQl 调用
然后我们按顺序对 Id 进行分组
我们将进行最后的 SQL 调用
这里我们将使用 EF
db.Orgs.Where(w => w.Title.Contains(search_query))
.Select(s => s.Id).ToList();
这个使用linq2Sql的Contains会被翻译成sqlWHERE IN
这里我们将使用纯 sqlWHERE + LIKE + AND
Select Id From Orgs where
Title LIKE '%' + @param0 +'%'
and Title LIKE '%' + @param1 +'%'
这里我们将使用纯 sqlWHERE + OR + And
Select Id From Orgs
where Title LIKE '%' + @param0 +'%'
or Title LIKE '%' + @param1 +'%'
这里我们将使用纯 sqlWHERE + OR + And
Select Id From Orgs
Where Keywords LIKE '%' + @param0 +'%'
or Keywords LIKE '%' + @param1 +'%'
这里我们将使用 EF
db.Orgs
.Where(w => w.Content.Contains(search_query)).
Select(s => s.Id).ToList();
这个使用linq2Sql的Contains会被翻译成sqlWHERE IN
我们将根据顺序检索对 id 进行排序
var ids = new Dictionary<int, int>();
foreach (var id in Ids1)
{
int val;
if (!ids.TryGetValue(id, out val))
{
ids.Add(id, ids.Count());
}
};
.
.
ids.OrderByDescending(o => o.Value)
.Select(s => s.Key) .ToArray();
这里我们将使用纯 sqlORDER BY + CASE WHEN ELSE END
Select * from Orgs
where Id in ( 2 , 1 )
ORDER BY CASE id
WHEN 2 THEN 0
WHEN 1 THEN 1
ELSE 2 END
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp9
{
class Program
{
static void search(string search_query)
{
//////////////////////////////////////////////////
var terms = search_query.Split(' ');
//////////////////////////////////////////////////
var Ids1 = db.Orgs.
Where(w => w.Title.Contains(search_query))
.Select(s => s.Id).ToList();
var Ids2 = db.Database
.SqlQuery<int>(getWhere("Title", "AND"), terms)
.ToList();
var Ids3 = db.Database
.SqlQuery<int>(getWhere("Title", "OR"), terms)
.ToList();
var Ids4 = db.Database
.SqlQuery<int>(getWhere("Keywords", "OR"), terms)
.ToList();
var Ids5 = db.Orgs
.Where(w => w.Content.Contains(search_query))
.Select(s => s.Id).ToList();
var ordered_ids = reorderList(Ids1, Ids2, Ids3, Ids4, Ids5);
var OrderedData = db.Database.SqlQuery<Org>(getOrdered(ordered_ids)).ToList();
//////////////////////////////////////////////////
foreach (var item in OrderedData)
{
Console.WriteLine($"{item.Id} - {item.Title} - {item.ContactPerson } - {item.Keywords } - {item.Content }");
}
//////////////////////////////////////////////////
Console.ReadLine();
//////////////////////////////////////////////////
string getWhere(string _column, string _oprator)
{
var val = "Select Id From Orgs where ";
for (int i = 0; i < terms.Length; i++)
{
if (i > 0) val += @" " + _oprator + " ";
val += @" " + _column + " LIKE '%' + {" + i + "} +'%' ";
}
return val;
}
//////////////////////////////////////////////////
string getOrdered(int[] _ids_ordered)
{
var val = "Select * From Orgs where ";
val += " Id in ";
for (int i = 0; i < _ids_ordered.Length; i++)
{
if (i == 0) val += "( ";
if (i > 0) val += " , ";
val += _ids_ordered[i];
if (i == terms.Length - 1) val += " ) ";
}
val += " ORDER BY CASE id ";
for (int i = 0; i < _ids_ordered.Length; i++)
{
val += " WHEN " + _ids_ordered[i] + " THEN " + i;
}
val += " ELSE " + _ids_ordered.Length + " END ";
return val;
}
//////////////////////////////////////////////////
int[] reorderList(List<int> _Ids1, List<int> _Ids2,
List<int> _Ids3, List<int> _Ids4, List<int> _Ids5)
{
var idsDic = new Dictionary<int, int>();
var idsArr = new List<int>[5] { Ids1, Ids2, Ids3, Ids4, Ids5 };
for (int i = 0; i < 5; i++)
{
idsArr[i].ForEach(id =>
{
if (!idsDic.TryGetValue(id, out int val))
idsDic.Add(id, idsDic.Count());
});
};
var o_ids = idsDic.OrderByDescending(o => o.Value)
.Select(s => s.Key).ToArray();
return o_ids;
}
}
static Model1 db = new Model1();
static void Main(string[] args)
{
string search_quer = "Alcohol Support";
Console.WriteLine($"searching for {search_quer}");
search("Alcohol Support");
}
}
}
什么是SQL注入(inject)
SQL injection is a code injection technique, used to attack data-driven applications, in which nefarious SQL statements are inserted into an entry field for execution
来自 Microsoft 文档:How to: Directly Execute SQL Queries | Microsoft Docs
The parameters are expressed in the query text by using the same curly notation used by Console.WriteLine() and String.Format(). In fact, String.Format() is actually called on the query string you provide, substituting the curly braced parameters with generated parameter names such as @p0, @p1 …, @p(n).
使用 EF 6.2 时
var sql2 = " Select Id From Orgs where ";
for (int i = 0; i < terms.Length; i++)
{
if (i > 0) sql2 += @" and ";
sql2 += @" Title LIKE '%' + {" + i + "} +'%' ";
}
将生成:
Select Id From Orgs where
Title LIKE '%' + {0} +'%'
and Title LIKE '%' + {1} +'%'
在 sqlserver 中使用 SQL Server Profiler
exec sp_executesql N' Select Id From Orgs where
Title LIKE ''%'' + @p0 +''%'' and Title
LIKE ''%'' + @p1 +''%'' ',N'@p0 nvarchar(7)
,@p1 nvarchar(7)',@p0=N'Alcohol',@p1=N'Support'
我们也可以使用 SqlParameter 类
var sql4 = " Select Id From Orgs where ";
var sql4_parameter = new List<SqlParameter>();
for (int i = 0; i < terms.Length; i++)
{
if (i > 0) sql4 += @" or ";
sql4 += @" Keywords LIKE '%' + @param" + i + " +'%' ";
sql4_parameter.Add(new SqlParameter("param" + i, terms[i]));
}
这里是sql
Select Id From Orgs
Where Keywords LIKE '%' + @param0 +'%'
or Keywords LIKE '%' + @param1 +'%'
关于c# - 按相关性/排名对搜索结果进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54074142/
我有一个如下所示的数据框: Samples GENE GEN1 GEN2 GEN3 GEN4 GEN5 Sample1 21.0 160 110 3.90 2.62 16.5 Sa
我有以下映射 posts":{ "properties":{ "prop1": { "type": "nested", "properties": { "item
我有两个维度相等的矩阵(p 和 e),我想在同名的列之间建立斯 PIL 曼相关。我想在矩阵 (M) 中输出对相关性 我使用了 Psych 库中的 corr.test() 函数,这是我所做的: libr
我有两个维度相等的矩阵(p 和 e),我想在同名的列之间建立斯 PIL 曼相关。我想在矩阵 (M) 中输出对相关性 我使用了 Psych 库中的 corr.test() 函数,这是我所做的: libr
我正在尝试使用 estpost 和 community-contributed 命令将 Spearman 相关矩阵导出到 rtf 或 Excel 文件中 esttab。 但是,我收到以下错误: inv
我在网上找到了以下查询: SELECT company_title FROM companies WHERE company_title like '%gge%' GROUP BY compa
我是 Sphinx 和 Lucene 的重度用户。Sphinx 只需要一个数据库,对其进行索引。然后您调用 Sphinx 获取 ID。 但是,如果我想创建一个非常微型 的搜索引擎怎么办?就几行数据,几
是否有我要在下面描述的模式/算法的名称?... 假设您有一棵像这样的相关数据树: IDEs Visual Studio Visual Studio 2008 Visual Studio 2010 Ec
早上好。这是我的问题:我有几个文件,如下所示: 104 0.1697 12.3513214 15.9136214 112 -0.3146 12.0517303 14.8027303 122 0.271
在尝试将function_score与boost_mode: "sum"一起使用时(因为这样可以更轻松地跟踪不同的贡献),我想归一化查询相关性对整体文档分数的影响,但是为此,我需要知道它可以取什么值。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
X,Y 的 spearmanr(Spearman 相关性)输出为我提供以下信息: 相关性:0.54542821980327882 P 值:2.3569040685361066e-65 其中 len(X
我有一个 Pandas 数据框,它有一个七年时间范围内的日期时间索引和 10 种不同 Assets 的价格数据。我想运行 dataframe.corr 函数来评估 Assets 之间的关系,我的问题是
我有相同数据(公司)的 2 个信息源,我可以通过唯一 ID(契约(Contract)号)将它们连接在一起。第二个不同来源的存在是由于这两个来源是手动独立更新的。所以我在 2 个表中有一个 ID 和一个
我正在尝试在php中实现两组数据之间人员相关系数的计算。我只是想做可以在这个 url 上找到的移植 python 脚本 http://answers.oreilly.com/topic/1066-ho
所以我使用 PHP Symfony 和 Ongr-Elasticsearch 包来查询我的文档并返回匹配的对象。结果似乎按相关性/分数排序,但实际相关性/分数不包含在对象本身中。 这可能吗?我想将分数
我想使用滚动窗口计算 DataFrame 两列之间的 Spearman 和/或 Pearson 相关性。 我试过df['corr'] = df['col1'].rolling(P).corr(df['
我正在处理一个大型数据集。不过,我将从一个小示例开始,以说明我要实现的目标。 我有以下向量: season %group_by(season, round, team)%>%dplyr::mutate
我正在使用 OIDC 的混合身份验证流程。 options.Events.OnRedirectToIdentityProvider = redirectContext =>
我正在尝试查询我的产品ElasticSearch索引并创建一个script_score,但我一直收到错误Variable [relevancy] is not defined. 我尝试只用一个数字替换
我是一名优秀的程序员,十分优秀!