我需要在我正在编写的C#MVC应用程序上实现一个“搜索”框。
我以前从来没有实施过“搜索”框,而且我一直在寻找一些最佳实践,而且我找不到我想要的东西。
我非常喜欢搜索在stackoverflow上的工作方式。
如果我输入几个随机字词,它会导航到网址http://stackoverflow/search?q=few+random+words。
如果我输入标题:随机,则导航到网址https://stackoverflow.com/search?q=title%3Arandom
客户端(当我按下回车键时)和服务器上发生了什么以进行搜索?
我故意遗漏了我已经对正在发生的事情的任何想法,因为我不想偏袒答案(或表现出我的无知)。
编辑:我正在为这个问题添加一些细节。
搜索词在哪里以及如何转换为查询字符串参数?即少数随机单词转换为少数+随机+单词,标题:随机转换为标题%3Arandom
在查询中使用的变量中,少数+随机+单词的位置和方式是什么?
查询只是一个大的Where子句,它会为每个位于+符号之间的项目追加“和”吗?
我猜你可以通过字符串解析并做一些替换来实现1和2但是看起来确实已经有了可以自动转换(和恢复)搜索字符串的东西。我正在尝试为用户在搜索框中键入ANYTHING做好准备。
答案 0 :(得分:3)
这些帖子将帮助您了解其工作原理
http://blog.stackoverflow.com/2008/10/stack-overflow-search-now-51-less-crappy/
http://blog.stackoverflow.com/2009/07/stack-overflow-search-now-61-less-crappy/
http://blog.stackoverflow.com/2011/01/stack-overflow-search-now-81-less-crappy/
答案 1 :(得分:3)
这些网址使用所谓的查询字符串。这是一个" GET"请求允许客户端脚本(javascript)以及后端代码检索用户"查询"。只要您看到'?'它是查询字符串的开头。这允许有人像:
http://google.com?q=Stuff%20to%20Search%20here 可以通过& anothercommand = somethingelse
添加多个参数因此允许程序或脚本在google上调用搜索,而无需在框中输入任何内容。
您可以使用C#" Request.QueryString ["参数"]"来访问查询字符串。在这种情况下,这些堆栈溢出URL的参数将是" q"。
之后,查询数据库并返回结果。由于我不确定您的编码有多好,我不确定您是否尝试过要求网站或C#SQL端。如果我错了,请道歉。
在客户端: 我想象它在客户端上发生的方式是,提交表单时文本框上的脚本重定向到您提到的URL,并将这些查询参数添加到url字符串中。不要忘记url编码。这是内置于JavaScript。即空间' '成为'%20'
当表单提交时,服务器代码会检查表格中是否有任何查询字符串参数" q"。如果有,并且它不为null,它将查询数据库,以几种方式之一返回,最有可能通过服务器控件。
1)这就是URL编码。它是URL中不支持的字符列表。因此他们需要改变。空间有一个标准集,例如%20。在javascript中,您将使用所需的查询字符串重定向到结果页面。在重定向之前,使用信息here对其进行编码。即改变' '进入+或%20(它应该是%20,我发现+通常是Internet Explorer的方式。 )
2)查询字符串的作用类似于密钥对值的哈希表。使用Request.QueryString,您可以选择密钥" q"并收到字符串"几个随机单词"。然后,这将被替换为您的SQL查询。这是在C#侧完成的,首先检查参数q是否存在。
3)您可以通过许多不同的方式进行查询。但是,搜索"和"等会给你很多不同的结果。您可以做的是解析常用单词列表,然后根据每个单词的结果数量对结果进行排名。即在最简单的搜索中,对于LARGE数据库来说,这是不明智的,并且......在类似于'%word%或'%word2%'要获得每个单词,请执行string.split。
答案 2 :(得分:2)
尽管我讨厌这样做,但我必须回答我自己的问题。我无法理解的是搜索词如何看似自动转换为查询字符串编码参数(即所有空格用+号替换而不是用%20替换)。我不明白这是如何实现的,我喜欢它所以我想要相同的能力。
最后,我应该做的是从SO复制html并在我自己的MVC网站上试用它,因为事实证明编码是内置/自动的。我没有做任何事情来获得功能。
以下是搜索框的基本HTML:
<form id="frmsearch" action="~/Catalog/Search" method="get">
<input id="q" name="q" value="@q" style="width:275px;"/>
<input id="submit" name="submit" type="submit" style="font-weight:bold;" value="Search" />
</form>
现在,如果您在名为“q”的文本框中键入“几个随机单词”并单击提交按钮,表单操作会自动将您带到“〜/ Catalog / Search?q = few + random + words”任何其他编码。
现在最好的部分是,在控制器代码中,“q”参数自动可用作“几个随机字”而不需要任何其他编码。
示例:
public ActionResult Search(string q)
{
//q = "few random words" (no need to remove '+' signs)
var model = GetSearchResults(q)
return View(model);
}
我唯一没有测试过它如何处理脚本攻击,但我想我也会免费获得它。 :)
希望这可以帮助任何偶然发现这个答案的人。感谢所有提交答案的人。如果我的问题不够明确,我很抱歉。