ElasticSearch with Nest:使用 Query<>.Wildcard 使用多个词进行部分搜索
ElasticSearch with Nest: Partial search using multiple words using Query<>.Wildcard
我一直在努力尝试使用 Nest 库版本 5.3.1(相同版本适用于其依赖项之一;Elasticsearch.Net)配置和部分搜索 ElasticSearch 索引数据。
根据网上找到的建议,我使用数据属性在一些索引属性上指定分析器类型,如下所示:
public class Article
{
public int Id { get; set; }
[Completion(Analyzer = "standard", PreservePositionIncrements = true, PreserveSeparators = true)]
public string Title { get; set; }
public string Url { get; set; }
}
我在搜索索引中至少有一条标题以 "The greatest ...." 开头的 "Article" 类型的记录。每当我使用下面的代码对关键字 "greatest" 执行部分搜索时,它都能很好地返回匹配的搜索结果。
MultiTermQueryRewrite multiqueryRewrite = null;
var searchQuery = Query<Article>.Wildcard(f => f.Title, "*greatest*", rewrite: multiqueryRewrite);
var client = ElasticsearchClient.GetClient<Article>();
return client.Search<Article>(s => s.Query(searchQuery));
但是...如果我尝试搜索 "the greatest" 具有下列任何变体的关键字,我不会得到任何结果。
var searchQuery = Query<Article>.Wildcard(f => f.Title, "*the greatest*", rewrite: multiqueryRewrite);
或
var searchQuery = Query<Article>.Wildcard(f => f.Title, "*the*greatest*", rewrite: multiqueryRewrite);
甚至
var searchQuery = Query<Article>.Wildcard(f => f.Title, "*the?greatest*", rewrite: multiqueryRewrite);
我是 ElasticSearch 产品的新手,如有任何帮助,我们将不胜感激。
在此先感谢您的帮助。
根据文档
Wild card Matches documents that have fields matching a wildcard expression (not analyzed).
由于标题字段是 Analyzed
,它在被索引之前被标记化。一些文本说 The Greatest
将被标记化,然后转换为小写( 标准分析器的行为)。因此它将作为两个标记 the
和 greatest
.
存储在反向索引中
当您搜索 *greatest*
时。它被搜索,因为有一个对应的令牌。
但是当您搜索 * the greatest *
时,找不到它,因为没有包含此文本的标记。
您可以使用Query String
var searchQuery = Query<Article>.QueryString(c => c
.Query("*the greatest*")
.DefaultField(p=>p.Title))
希望对您有所帮助!!
应用于“标题”字段的标准分析器会按照以下格式生成 "The Greatest" 标题的小写术语 [the, greatest]。您可以考虑使用 Keyword Analyzer,但请注意您必须处理单词大小写。
我一直在努力尝试使用 Nest 库版本 5.3.1(相同版本适用于其依赖项之一;Elasticsearch.Net)配置和部分搜索 ElasticSearch 索引数据。
根据网上找到的建议,我使用数据属性在一些索引属性上指定分析器类型,如下所示:
public class Article
{
public int Id { get; set; }
[Completion(Analyzer = "standard", PreservePositionIncrements = true, PreserveSeparators = true)]
public string Title { get; set; }
public string Url { get; set; }
}
我在搜索索引中至少有一条标题以 "The greatest ...." 开头的 "Article" 类型的记录。每当我使用下面的代码对关键字 "greatest" 执行部分搜索时,它都能很好地返回匹配的搜索结果。
MultiTermQueryRewrite multiqueryRewrite = null;
var searchQuery = Query<Article>.Wildcard(f => f.Title, "*greatest*", rewrite: multiqueryRewrite);
var client = ElasticsearchClient.GetClient<Article>();
return client.Search<Article>(s => s.Query(searchQuery));
但是...如果我尝试搜索 "the greatest" 具有下列任何变体的关键字,我不会得到任何结果。
var searchQuery = Query<Article>.Wildcard(f => f.Title, "*the greatest*", rewrite: multiqueryRewrite);
或
var searchQuery = Query<Article>.Wildcard(f => f.Title, "*the*greatest*", rewrite: multiqueryRewrite);
甚至
var searchQuery = Query<Article>.Wildcard(f => f.Title, "*the?greatest*", rewrite: multiqueryRewrite);
我是 ElasticSearch 产品的新手,如有任何帮助,我们将不胜感激。
在此先感谢您的帮助。
根据文档
Wild card Matches documents that have fields matching a wildcard expression (not analyzed).
由于标题字段是 Analyzed
,它在被索引之前被标记化。一些文本说 The Greatest
将被标记化,然后转换为小写( 标准分析器的行为)。因此它将作为两个标记 the
和 greatest
.
当您搜索 *greatest*
时。它被搜索,因为有一个对应的令牌。
但是当您搜索 * the greatest *
时,找不到它,因为没有包含此文本的标记。
您可以使用Query String
var searchQuery = Query<Article>.QueryString(c => c
.Query("*the greatest*")
.DefaultField(p=>p.Title))
希望对您有所帮助!!
应用于“标题”字段的标准分析器会按照以下格式生成 "The Greatest" 标题的小写术语 [the, greatest]。您可以考虑使用 Keyword Analyzer,但请注意您必须处理单词大小写。