【问题标题】:Attribute Keyword with Index=true fails on searchIndex=true 的属性关键字在搜索时失败
【发布时间】:2017-03-16 18:11:43
【问题描述】:

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

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

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

但是,当我搜索 URL 时,说“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
   };
}

【问题讨论】:

  • 你搜索的怎么样了,你能显示你正在做的搜索请求吗?我怀疑您正在使用对查询输入执行分析的全文查询
  • 添加了搜索代码。我认为你是对的。我的搜索代码解析到的低级查询可能使用的是全文。但会等待您的确认。有没有办法准确查看发送到 ES 的低级查询?谢谢。

标签: elasticsearch nest


【解决方案1】:

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

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

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

在查询时,还有几层:

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

假设您没有上述定义,那么您的查询输入将由 standard analyzer 进行分析,从而使其根据特定的分隔符进行拆分

修复:

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

【讨论】:

  • 谢谢。对于像我这样刚开始使用 ES 的人来说非常有用。
  • 我认为@Redzon 仍然希望映射为keyword 类型,但可能会为小写添加规范化器:elastic.co/guide/en/elasticsearch/reference/current/…。然后按照您的建议使用term 查询
  • @RussCam,是的,将规范化器添加到小写并使用 rahuldoc 建议的术语查询就可以了。谢谢你们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
相关资源
最近更新 更多