如何使用通配符从 Elasticsearch 查询字符串中找到真​​实分数?

How can I find the true score from Elasticsearch query string with a wildcard?

我的 ElasticSearch 2.x NEST 查询字符串搜索包含一个通配符:

在 C# 中使用 NEST:

var results = _client.Search<IEntity>(s => s
    .Index(Indices.AllIndices)
    .AllTypes()
    .Query(qs => qs
        .QueryString(qsq => qsq.Query("Micro*")))
    .From(pageNumber)
    .Size(pageSize));

想出这样的东西:

$ curl -XGET 'http://localhost:9200/_all/_search?q=Micro*'

此代码源自 ElasticSearch page on using Co-variants。结果是协变的;它们是来自多个指数的混合类型。我遇到的问题是所有点击都返回 1 分。

这与类型或提升无关。我可以按类型提升,或者,有没有办法显示或 "explain" 搜索结果,以便我可以按分数排序?

通配符搜索总是 return 得分为 1。 您可以按特定类型进行提升。看到这个:

默认情况下,

Multi term queries like wildcard query 会获得等于提升的恒定分数。您可以使用 .Rewrite() 更改此行为。

var results = client.Search<IEntity>(s => s
    .Index(Indices.AllIndices)
    .AllTypes()
    .Query(qs => qs
        .QueryString(qsq => qsq
            .Query("Micro*")
            .Rewrite(RewriteMultiTerm.ScoringBoolean)
        )
    )
    .From(pageNumber)
    .Size(pageSize)
);

对于 RewriteMultiTerm.ScoringBoolean,重写方法首先将每个术语翻译成 bool 查询中的 should 子句,并保持查询计算的分数。

请注意,这可能是 CPU 密集的,并且默认限制为 1024 bool 个查询子句,对于大型文档语料库可以很容易地命中; 运行 例如,您对完整 Whosebug 数据集(问题、答案和用户)的查询达到了问题的子句限制。您可能希望使用使用 an edgengram token filter.

的分析器来分析一些文本