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 分析,这使得它根据特定的分隔符进行拆分
修复:
- 将
[search_analyzer][2]
的字段映射更新为 Keyword Analyzer
- 使用term query
我正在为网站列表编制索引,而 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 分析,这使得它根据特定的分隔符进行拆分
修复:
- 将
[search_analyzer][2]
的字段映射更新为 Keyword Analyzer - 使用term query