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 将被标记化,然后转换为小写( 标准分析器的行为)。因此它将作为两个标记 thegreatest.

存储在反向索引中

当您搜索 *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,但请注意您必须处理单词大小写。