gpt4 book ai didi

c# - ElasticSearch 结合 MultiMatch 和 Must

转载 作者:行者123 更新时间:2023-12-03 00:31:27 30 4
gpt4 key购买 nike

所以我有这个对象模型:

string Name; // name of the person
int Age; // age of the person
string CreatedBy; // operator who created person

我的查询听起来像这样: all documents WHERE Age > 40 AND CreatedBy == 'callum' AND Name contains 'll' CreatedBy是必要的,控制范围。
Age也是必要的(但不是安全问题)
Name是它可能变得模糊的地方,因为这是用户正在查询的内容。类似于 sort of contains
下面的查询适用于前两部分:
"query": {
"bool": {
"must": [
{
"range": {
"age": {
"gt": 40
}
}
},
{
"match": {
"createdBy": "Callum"
}
}
]
}
}

我尝试添加 multi_match因为最终它可能会搜索 Name , Address以及其他一些信息。我不知道把它放在哪里。

在我看来,嵌套查询会很有用。所以先过滤掉所有不相关的用户,再过滤掉不相关的年龄。然后对相关字段进行一些模糊匹配。

最佳答案

所以,这个问题的答案并不简单。

首先,您需要为 Compound Words 创建一个分析器.

所以在 .NET 客户端中它看起来像:

this.elasticClient.CreateIndex("customer", p => p
.Settings(s => s
.Analysis(a => a
.TokenFilters(t => t
.NGram("bigrams_filter", ng => ng
.MaxGram(2)
.MinGram(2)))
.Analyzers(al => al
.Custom("bigrams", l => l
.Tokenizer("standard")
.Filters("lowercase", "bigrams_filter"))))));

this.elasticClient.Map<Person>(m => m
.Properties(props => props
.String(s => s
.Name(p => p.Name)
.Index(FieldIndexOption.Analyzed)
.Analyzer("bigrams"))
.String(s => s
.Name(p => p.CreatedBy)
.NotAnalyzed())
.Number(n => n
.Name(p => p.Age))));

这是提供的第一个链接的一种直接翻译。现在这意味着所有名称都将被分解为它们的二元组表示:

卡勒姆
  • ca

  • 然后您需要实际的查询来利用这一点。现在这有点我喜欢,因为我们已经在 name 列上设置了索引,这意味着所有 term查询中可以包含部分单词,因此以这个为例(Sense 查询):
    GET customer/_search
    {
    "query": {
    "filtered": {
    "query": {
    "multi_match": {
    "query": "ll",
    "fields": ["name"]
    }
    },
    "filter": {
    "bool": {
    "must": [
    {
    "range": {
    "age": {
    "gt": 40
    }
    }
    },
    {
    "match": {
    "createdBy": "Callum"
    }
    }
    ]
    }
    }
    }
    }
    }

    在这里,我们有一个过滤查询。所以查询总是第一个运行(还没有找到引用它的文档,但我已经阅读了它),这将是部分术语匹配。然后我们简单地过滤——这是在查询之后完成的——以获得我们需要的结果子集。

    因为 ngrams分析器仅设置在 name这是唯一将部分匹配的列。所以 CreatedBy不会,因此我们在结果周围获得了安全性。

    关于c# - ElasticSearch 结合 MultiMatch 和 Must,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37995538/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com