当前位置: 首页 > 知识库问答 >
问题:

ElasticSearch嵌套-如何在搜索中确定字段的优先级

何宏博
2023-03-14

我只需要在文档中的三个字段中搜索一个术语,并根据搜索术语的位置对结果进行排序。例如,找到3个文档:1个在字段2中有搜索词,2个在字段3中有搜索词,3个在字段1中有搜索词。

我想按顺序看:3、1、2。

我以为我可以用助推来做。现在我使用以下方法:

var results = ES.Search<SearchData>(s => 
         s.TrackScores()
           .Query(q =>
                  q.Range(v => v.OnField(x => x.ExpirationDate).GreaterOrEquals(DateTime.Today)) &&
                  q.MultiMatch(m => 
                               m.OnFieldsWithBoost(b =>
                                                   b.Add(d => d.Field1, 3)
                                                    .Add(d => d.Field2, 2)
                                                    .Add(d => d.Field3, 1))
                                .Operator(Operator.And)
                                .Query(term)))
                    .Sort(doc => doc.OnField("_score").Descending())
                    .SortDescending(doc => doc.Date));

然而,它似乎是,如果我有一个文档与4个词等于搜索词在字段2和另一个文档与1个词在字段1,比后者将有一个较小的分数。

我看到的一个解决方案是为field1和field2设置更大的值,如下所示:

b.Add(d => d.Field1,1000)     
 .Add(d => d.Field2, 100)

但这并不理想,所以我真的希望你有一个更好的。

共有1个答案

申屠英韶
2023-03-14

我的最终解决方案是:

var results = ES.Search<SearchData>(
                s => s.TrackScores()
                    .Query(q => q.Range(v => v.OnField(x => x.ExpirationDate).GreaterOrEquals(DateTime.Today)) &&
                        (q.ConstantScore(cs => cs.Query(qcs => qcs.MultiMatch(m => m.OnFields(b => b.Field1).Operator(Operator.And).Query(searchTerm))).Boost(1000))
                        || q.ConstantScore(cs => cs.Query(qcs => qcs.MultiMatch(m => m.OnFields(b => b.Field2).Operator(Operator.And).Query(searchTerm))).Boost(10))
                        || q.ConstantScore(cs => cs.Query(qcs => qcs.MultiMatch(m => m.OnFields(b => b.Field3).Operator(Operator.And).Query(searchTerm))).Boost(1))))
                                        .Sort(doc => doc.OnField("_score").Descending())
                                        .SortDescending(doc => doc.Date));
 类似资料:
  • 问题内容: 我对ES还是相当陌生,并正在将其用于我的新项目。首先,我为客户提供了一个简单的映射,其中包含名字和姓氏以及付款信息对象列表。如果我在SQL中执行此操作,那将类似于客户表和具有1:许多关系的付款信息表。 这是我要执行的操作的一个简单示例:https : //gist.github.com/anonymous/6109593 我希望根据payInfos嵌套数组中的任何匹配项找到任何客户,即

  • 我使用Spring-Data-ElasticSearch2.0.8和ElasticSearch.2.2.0来动态搜索嵌套对象。 基本上,我的嵌套对象可以有很少的嵌套字段,但我希望在所有这些字段中动态搜索。例如,一个动物文档可以有3x个字段来描述它:名称/大小/描述。 我想在所有这些搜索,因为我的搜索结束点只是有一个‘描述’自由文本选项。因此,当用户在他的入口点键入'15'或'dog'时,搜索将检查

  • 在ElasticSearch6中,我有如下嵌套对象的数据: 我想从字段brand_name或字段title进行搜索。我想在相同的inner_hits中返回所有结果。 例如:如果我将搜索字符串输入为“xyz”,它应该返回两个brands对象和相应的product对象。如果我将搜索字符串输入为“test”,它应该只返回第一个品牌数组,只有第一个产品对象。 我怎么才能做到这一点。有什么想法吗? 我尝试使

  • 问题内容: 考虑一下这样的Elasticsearch中的文档: 我想搜索时不知道它是在文档的第一层还是第二层。这可能吗?还请记住,嵌套级别可以是任何东西(在开发时未知)。 如果可能的话,在不知道文档第二级中存在的情况下通过搜索返回该文档的查询是什么? 问题答案: 试试这个:

  • 我正在尝试使用NEST c#客户端搜索我的弹性搜索嵌套对象。我的索引名称是”,我的”字段。 这是我的班级: 现在我的web应用程序看起来像这样: 这里是我需要搜索的单词。 我在浏览器的搜索框(网络表单)中输入它。 搜索关键字可能包含任何需要与我的表人员中的任何字段的值匹配。 如果搜索关键字与嵌套文档匹配,则应返回确切的嵌套文档。 我不知道我的嵌套查询有问题,或者我实际上不知道如何使用嵌套查询来执行

  • 我有以下疑问: 这将搜索给定索引\type ex中的所有字段。Mytype具有字段1、字段2、字段3这将“ABC”与字段1、字段2、字段3匹配 在3个字段上设置了相等的值,我需要对字段排名进行优先级排序,所以让我们假设优先级应该是field2、field3、field1 如何修改搜索以设置字段排名/优先级? 在我的研究中,我看到了_分数,但这看起来像是用来对每个文档而不是字段进行优先级排序的。