如何在MVC中实现全文搜索

时间:2016-08-27 07:45:35

标签: sql asp.net-mvc full-text-search

我在MVC中使用了一个有效的搜索引擎。

/View/Content/Index.cshtml

@model IEnumerable<Example.Models.Content>

@using (Html.BeginForm("Index", "Content", FormMethod.Get))
 {
  @Html.TextBox("keyword0")
 }

@foreach (var item in Model)
 {
    @Html.DisplayFor(item.article_title)
 }

/Controllers/ContentController.cs

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using Example.Models;

namespace Example.Controllers
{
    public class ContentController : Controller
    {
        public ActionResult Index(string keyword0)
        {
            return View(db.Content.Where(x => x.article_title.Contains(keyword0)).ToList());
        }
    }
}

搜索返回SQL中与您使用的关键字匹配的article_title列的结果。如果我在搜索中键入 foo ,则会返回SQL中article_title包含foo的任何记录。

我正在尝试使用全文功能增强搜索引擎。我已将SQL中的article_title列转换为全文索引。在SQL Server Management Studio中,全文搜索按预期工作,仅显示包含关键字foo和bar的记录。

select * from table_name where contains (article_title, 'foo and bar')

在我的MVC应用程序中,如果我在搜索中输入 foo bar ,则不会显示任何记录。因为URL以search = foo + bar结尾,所以不显示任何记录,因为在SQL中没有记录,其中article_title包含 foo + bar 。我已将/Controllers/ContentController.cs更新为使用keyword0和keyword1进行搜索。

return View(db.Content.Where(x => x.article_title.Contains(keyword0) && x.article_title.Contains(keyword1)).ToList());

如果我手动将网址调整为www.example.com/?keyword0=foo&keyword1=bar,则搜索会正常运行,并且只显示包含foo和bar的记录。

我遇到的挑战是将foo和bar从View中的@HTML.TextFor传递给Controller中的 public ActionResult Index(),然后拆分foo和bar,以便keyword0包含foo和keyword1包含bar。

我想出的想法是将@ Html.TextBox中输入的文本从视图传递到名为搜索的变量中的Controller。然后,Controller将通过将字符串搜索添加到公共ActionResult来检索此文本。

public ActionResult Index(string search)
{
    return View(db.Content.Where(x => x.article_title.Contains(keyword0) && x.article_title.Contains(keyword1)).ToList());
}

如果我现在发布应用程序,则没有错误。但是,字符串搜索变量中的文本未传递给keyword0或keyword1。我的下一个想法是在字符串搜索变量中拆分文本,然后创建变量keyword0和keyword1。

public ActionResult Index(string search)
{
    string[] keywords = search.Split(' ');
    string keyword0 = keywords[0];
    string keyword1 = keywords[1];
    return View(db.Content.Where(x => x.article_title.Contains(keyword0) && x.article_title.Contains(keyword1)).ToList());
}

当我添加代码以将搜索变量拆分为我的Controller时,Web浏览器会产生错误处理您的请求时出错。我不确定如何拆分搜索变量然后创建变量keyword0和keyword1而不产生处理请求时出错

0 个答案:

没有答案