索引= true的属性关键字在搜索时失败

时间:2017-03-16 02:01:18

标签: elasticsearch nest

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

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

创建索引后,映射如下所示: “网址”:{    “type”:“关键字” }

但是,当我搜索网址时,请说“www.yahoo.com”,不会返回任何结果。 两个问题:

a)为什么不归还文件?这是一个简单的关键字搜索,因此应返回匹配。

b)使用默认分析器进行上述索引是否相同?在我看来,没有分析的关键字搜索是“明确的”,可能更快。

感谢。

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
   };
}

1 个答案:

答案 0 :(得分:1)

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

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

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

在查询时,还有一些层:

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

假设您没有上面定义的内容,那么standard analyzer正在分析您的查询输入,这会根据特定的分隔符进行拆分

FIX:

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