【问题标题】:Search using elasticsearch (contains)使用elasticsearch搜索(包含)
【发布时间】:2018-07-24 21:36:49
【问题描述】:

我正在开发名为 eBookRepository 的 ASP.NET MVC 应用程序,其中包含在线书籍。 电子书有自己的标题、作者等。所以现在我正在尝试实现我的搜索机制。我必须使用 Elasticsearch 作为搜索引擎。

我在这段代码中索引了我的电子书,它有效。

Uri nodeLocation = new Uri("http://localhost:9200");
IConnectionPool connectionPool = new SniffingConnectionPool(new List<Uri> { nodeLocation });
ConnectionSettings settings = new ConnectionSettings(connectionPool).DefaultIndex("ebookrepository");
  esClient = new ElasticClient(settings);

foreach (var ebook in ebooksService.GetAll())
{
            IIndexResponse result = esClient.Index(ebook, i => i.Index("ebookrepository").Type("ebook").Id(ebook.ID));
}

此外,如果我按标题搜索我的电子书,它会起作用,但前提是搜索文本与电子书的标题完全相同。这样做的代码在这里:

var search = esClient.Search<Ebook>(s => s.Source(sf => sf.IncludeAll()).Query(q => q.Term(p1 => p1.Title, searchString)));

searchString 变量是我在 UI 上的文本框中键入的字符串(文本)。

所以我找不到像上面这样的类似代码,它应该像 C# 中的 .contains 方法一样工作,我正在寻找正确的解决方案,我认为我应该使用 .Match 而不是 .Term (.Term返回完全匹配的结果),但我找不到正确的解决方案。

虽然我在寻找正确的解决方案,但很多问题和答案都是 JSON 格式(我不擅长),我不想要那种格式,我需要 .NET 代码。

【问题讨论】:

    标签: c# asp.net asp.net-mvc elasticsearch


    【解决方案1】:

    【讨论】:

    • 不,它不起作用。我试过 var searchResponse = esClient.Search(s => s.Query(q => q.Match(m => m.Field(f => f.Title).Query(searchString))));
    • 您能再尝试一个查询吗? var searchResponse = esClient.Search(s => s .Query(q => q .Term(p => p.Title, searchString) ) );
    • 不,它不起作用。 .Term 只返回完全匹配的结果。我正在使用它,我在我的问题中发布了带有 .Term 的代码。
    【解决方案2】:

    使用这个

    var hits = _context.Search<Ebook>(search string, new SearchUrlParameters { Pretty = true });
    

    【讨论】:

    • 什么是 SearchUrlParameters?我没有引用它。
    • 它是 ElasticsearchCRUD.dll 的一个类
    • 不,它不起作用。它在 .Search 下的红线,上面写着“搜索 API 允许执行搜索查询并返回与查询匹配的搜索命中。方法 'Search' 没有重载需要 2 个参数
    猜你喜欢
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多