版本升级后 ElasticSearch / Nest MatchPhrasePrefix 停止工作

我从以下升级:

  • ElasticSearch 2.0 到 6.6.1

  • ElasticSearch.Net Nuget 包 2.4.6 到 6.5.1

  • NEST NuGet 包 2.4.6 到 6.5.1

...和我的 Nest 查询来执行 MatchPhrasePrefix 停止返回结果。

该软件是一个网页搜索引擎,其中一个功能应该是让您将结果限制为以特定路径开头的 URL,例如http://example.com/blog在搜索结果中只查看博客文章。

我有一个mainQuery工作正常。如果用户提供了一个urlStartstWith值,则与/查询mainQuery一起获取。boolMatchPhrasePrefix

索引包含从 100 到 1000 的文档。

我尝试过但不起作用的事情:

  • 完全重建新索引

  • 删除了,.Operator(Operator.And)因为它在这个版本的 NEST 中不存在(导致编译错误)

  • 将“MaxExpansions”增加到各种值,最高可达 5000

  • URL编码urlStartstWith

  • 删除.MinimumShouldMatch(1)线

如果我对旧的 ElasticSearch 2.0 版服务器运行使用新 NEST 库构建的这个查询,它就可以工作。所以我认为这在 ElasticSearch 本身的内部已经发生了变化。

查询

var urlStartWithFilter = esQuery.Bool(b =>

    b.Filter(m =>

        m.MatchPhrasePrefix(pre =>

            pre

                //.MaxExpansions(5000) //did nothing

                //.Operator(Operator.And) //does not exist in new version of NEST

                .Query(urlStartsWith)

                .Field(f => f.Url))

        )

        .MinimumShouldMatch(1)

    );


mainQuery = mainQuery && urlStartWithFilter;

按要求 - 从头到尾示例


这是一个显示问题的示例,与我查询实际项目的网页索引的方式非常接近。


让 ElasticSearch 6.6.1 实例运行。您可以通过以下方式在 docker 中执行此操作:


docker pull docker.elastic.co/elasticsearch/elasticsearch:6.6.1

docker network create esnetwork --driver=bridge

docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --name elasticsearch -d --network esnetwork docker.elastic.co/elasticsearch/elasticsearch:6.6.1

创建一个新的 .Net Framework 4.6.1 控制台应用程序。将以下内容粘贴到Program.cs


慕的地6264312
浏览 171回答 1
1回答

千巷猫影

好的,我真的不明白为什么旧查询适用于 elasticsearch 2.0 而不是 elasticsearch 6.6,但是将内部查询更改为此使其适用于 ES2 和 ES6:if (include_starts_with){    var urlStartsWith = "https://stackoverflow.com/questions/";    var urlStartWithFilter = esQuery.MatchPhrasePrefix(pre => pre        .Query(urlStartsWith)        .Field(f => f.link)    );    mainQuery = mainQuery && urlStartWithFilter;}
打开App,查看更多内容
随时随地看视频慕课网APP