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

时间:2016-09-20 19:45:12

标签: elasticsearch nest

我的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的分数回归。

这不管是什么类型或提升。我可以按类型提升,或者有没有办法透露或“解释”搜索结果,以便我可以按分数排序?

2 个答案:

答案 0 :(得分:4)

默认情况下,

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,重写方法首先将每个术语转换为should查询中的bool子句,并保留由查询计算的分数。

请注意,这可能是CPU密集型的,并且默认限制为1024 bool个查询子句,可以轻松地为大型文档语料库命中;例如,在完整的StackOverflow数据集(问题,答案和用户)上运行查询时,会触及问题的子句限制。您可能希望使用使用an edgengram token filter的分析器分析某些文本。

答案 1 :(得分:0)

通配符搜索将始终返回1分。 您可以通过特定类型进行提升。看到这个: How to boost index type in elasticsearch?