Index=true 的属性关键字搜索失败

Attribute Keyword with Index=true fails on search

我正在为网站列表编制索引,而 Urls 是网站的属性之一(名称、位置是其他属性)。我想使用 url/s 搜索网站。我不想分析这个 属性,而是想搜索完整的 url(关键字)。所以我的代码看起来像这样。

[Keyword(index = true)]
public IEnumerable<string> Urls {get; set;}

创建索引后,映射如下所示, "urls":{ "type": "keyword" }

但是,当我搜索 url 时,说 "www.yahoo.com",return 没有结果。 两个问题:

a) 为什么不 return 编辑文档?这是一个简单的关键字搜索,因此应该 return 匹配。

b) 执行上述操作是否与使用默认分析器建立索引相同?在我看来,不进行分析的关键字搜索 'explicit' 并且可能更快。

谢谢。

PS: 我的搜索代码使用Nest (v5.0.0.0) 如下。

public SearchResult<Website> Search(string qry, int page, int pageSize)
{
   var result = client.Search<Website>(x => x.Query(q => q.MultiMatch(mp => mp.Query(qry).Fields(f => f.Fields(f1 => f1.Name, f2 => f2.Urls, f3 => f3.Locations)))).Size(pageSize));

   return new SearchResult<Website>
   {
      Results = result.Documents
   };
}

当您使用 type=keyword 查询字段作为全文查询(即匹配查询)时,它使用默认为分析器设置的 search_analyzer

在索引时,Elasticsearch 将按以下顺序查找分析器:

  • 字段映射中定义的分析器。
  • 索引设置中名为 default 的分析器。
  • 标准分析仪。

查询时,多了几层:

  • 全文查询中定义的分析器。
  • 字段映射中定义的search_analyzer。
  • 字段映射中定义的分析器。
  • 索引设置中名为 default_search 的分析器。
  • 索引设置中名为 default 的分析器。
  • 标准分析仪。

假设您没有上述定义,那么您的查询输入正在被 standard analyzer 分析,这使得它根据特定的分隔符进行拆分

修复:

  1. [search_analyzer][2] 的字段映射更新为 Keyword Analyzer
  2. 使用term query