【问题标题】:ElasticSearch with Nest: Partial search using multiple words using Query<>.WildcardElasticSearch with Nest:使用 Query<>.Wildcard 使用多个单词进行部分搜索
【发布时间】:2017-05-08 15:42:18
【问题描述】:

我一直在努力尝试使用 Nest 库版本 5.3.1 配置和部分搜索 ElasticSearch 索引数据(相同版本适用于它的依赖项之一;Elasticsearch.Net)。

根据网上的建议,我使用数据属性在一些索引属性上指定分析器类型,如下所示:

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

我在搜索索引中至少有一条“文章”类型的记录,其标题以“最伟大的......”开头。每当我使用下面的代码对关键字“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));

但是...如果我尝试使用下面列出的任何变体搜索“最伟大”的关键字,我不会得到任何结果。

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 产品的新手,非常感谢任何帮助。

提前感谢您的帮助。

【问题讨论】:

    标签: elasticsearch nest elasticsearch-net


    【解决方案1】:

    根据文档

    通配符匹配具有与通配符表达式匹配的字段的文档(未分析)。

    由于标题字段是Analyzed,因此它在被索引之前被标记化。一些文本说The Greatest 将被标记化,然后转换为小写(标准分析器的行为)。因此它将作为两个标记thegreatest 存储在反向索引中。

    当您搜索*greatest* 时。它被搜索,因为有一个与之对应的令牌。

    但是当您搜索 * the greatest * 时,由于没有包含此文本的令牌,所以找不到它。

    您可以使用Query String

     var searchQuery = Query<Article>.QueryString(c => c
    .Query("*the greatest*")
    .DefaultField(p=>p.Title))
    

    希望这会有所帮助!

    【讨论】:

    • 感谢@Richa 的回复,我确实觉得它很有用。根据您的建议,我最终不得不另外指定“默认运算符”,以确保匹配结果中同时出现“the”和“greatest”两个词。 Query&lt;Article&gt;.QueryString(qs =&gt; qs.Query(term).DefaultField(f =&gt; f.Title).DefaultOperator(Operator.And));
    【解决方案2】:

    应用于“标题”字段的标准分析器会生成以下格式的“最伟大”标题的小写术语 [the, best]。您可以考虑使用Keyword Analyzer,但请注意您必须处理单词大小写。

    【讨论】:

    • 感谢@JoanieBrar 的建议
    猜你喜欢
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    相关资源
    最近更新 更多