弹性搜索2.0搜索一样查询

问题描述 投票:0回答:1

这是我的模型。

[ElasticsearchType(Name = "projectmodel")]
public class ProjectModel
{          
    public string name { get; set; }
    public string description { get; set; }
    [Nested]
    [JsonProperty("taskmodels")]
    public List<TaskModel> taskmodels { get; set; }
}

public class TaskModel
{       
    public string title { get; set; }
    public string description { get; set; }
}

我用以下代码在主对象和嵌套对象中进行搜索.

        var searchResults = client.Search<ProjectModel>(
            body => body.Query(
                query => query.Bool(
                    bq => bq.Should(
                        q => q.Match(p => p.Field(f => f.name).Boost(6).Query(keyword)),                            
                        q => q.Match(p => p.Field(f => f.description).Boost(6).Query(keyword)),
                            sh => sh.Nested(n => n.Path(p => p.taskmodels).Query(nq => nq.Match(
                                m => m.Query(keyword).Field("taskmodels.description")

                                )
                            )
                            ),
                            sh => sh.Nested(n => n.Path(p => p.taskmodels).Query(nq => nq.Match(
                                m => m.Query(keyword).Field("taskmodels.title")

                                )
                            )
                            )
                        )

                    )
                ).Size(MAX_RESULT)
            );

这搜索对象没有任何问题。但是我需要输入精确的单词作为搜索文本来获得结果。

举个例子:名称--"科学与技术"

如果我用技术搜索,它返回的记录。但如果我用techno搜索,它没有返回记录。我如何解决这个问题?

c# search elasticsearch-2.0
1个回答
1
投票

你可以添加 匹配_短语_前缀 在您的字段上进行查询。

Match_phrase_prefix将取你的搜索查询中的最后一个标记,并对其进行短语前缀匹配。tokens的顺序很重要。如果你想在文本中的任何地方搜索,那么你将需要创建 和代币的边角料

var searchResults = _elasticClient.Search<ProjectModel>(
            body => body.Query(
                query => query.Bool(
                    bq => bq.Should(
                        q=> q.MatchPhrasePrefix(p=>p.Field(f=>f.name).Query(keyword)) --> note
                        q => q.Match(p => p.Field(f => f.name).Boost(6).Query(keyword)),
                        q => q.MatchPhrasePrefix(p => p.Field(f => f.description).Boost(6).Query(keyword)),
                            sh => sh.Nested(n => n.Path(p => p.taskmodels).Query(nq => nq.Match(
                                m => m.Query(keyword).Field("taskmodels.description")

                                )
                            )
                            ),
                            sh => sh.Nested(n => n.Path(p => p.taskmodels).Query(nq => nq.Match(
                                m => m.Query(keyword).Field("taskmodels.title")

                                )
                            )
                            )
                        )

                    )
                ).Size(MAX_RESULT)
            );

匹配、匹配短语和匹配短语前缀之间的不同。

假设有一个文档的 "描述 "字段为:"科学与技术",这个文本被分解成不同的标记["科学", "和", "技术"],并以倒序索引的方式存放。

如果你想查找 "科学与技术",你可以使用匹配查询。对于匹配的词的顺序并不重要,所以当你搜索 "technology "时,你也会得到文档。它只是匹配标记。

如果顺序对你来说很重要,那么使用match_phrase "科学和技术 "只会返回文档。

如果你想搜索部分句子 "science and techno",那么使用match_phrase_prefix 。前缀匹配只在最后一个标记上进行,所以你不能搜索 "scie and techno"。对于这个问题,还有其他选项,比如edge-ngrams和ngrams。

© www.soinside.com 2019 - 2024. All rights reserved.