匹配源 ElasticSearch Nest 中的每个字段
Match for every field in source ElasticSearch Nest
我需要在源的每个字段中搜索一个字符串值。因此,如果我的字符串“queryValue”是“test”并且我的索引中有如下内容:
"hits": [
{
"_index": "sql-data",
"_type": "_doc",
"_id": "jTI5kHMBal-9d-PPo5Kr",
"_score": 1.0,
"_source": {
"Id": 57,
"object1": [
{
"description": "test",
}
],
"object2": [
{
"description": "nomore",
}
],
}
]
我想从我的查询中得到这个命中,因为 object1 的描述是测试。
那是我的代码,实际上 returns 我索引中的每个匹配项,而不仅仅是匹配的:
var searchResponse = client.SearchAsync<Document>(s => s
.Source(sf => sf
.IncludeAll())
.Query(p => p
.Match(s => s
.Query(queryValue)
)))
.Result;
有多种方法可以做到这一点。但其中每一项的可行性取决于您实际实现映射的方式。
使用 _all 字段
_all字段下的数据只做索引不存储。因此,您只能搜索数据但无法检索。使用 _all
有其自身的局限性,因为数据首先连接成一个字符串,然后进行分析和索引。因此,诸如部分匹配或任何特定分析器行为之类的事情可能是不可能的。为此,您可能需要指定一个自定义分析器来覆盖此行为。这实际上可能 膨胀 您的索引。最重要的是,您应该在编制索引时启用 _all
字段。除非有非常严格的要求并且使用旧版本的 ES,否则最好不要走这条路。 这在 6.0 版中已弃用并在 7.0 版中删除
使用multi_match
elasticsearch 的 Multi-match 允许我们构建匹配多个字段的匹配查询。您可以在查询 DSL 中指定要搜索的所有字段。您可以创建一个如下所示的方法来执行多重匹配用法。
private static QueryContainer BuildMultiMatchQuery(string queryValue)
{
return new QueryContainerDescriptor<Document>()
.MultiMatch(c => c
.Fields(f => f
.Field(doc => doc.Field1)
.Field(doc => doc.Field2)
// other fields)
.Query(queryValue)
// Add other properties and configuration like analyzers you need, in this block
);
}
这可以按如下所示的方式添加到您的 searchAsync 调用链中
var searchResponse = client.SearchAsync<Document>(s => s
// ...other code
.Query(BuildMultiMatchQuery(queryValue))
// ...other code
).Result;
了解来自 here and about _all
from here
的 multi-match
查询
您可能还想看看 copy_to
我需要在源的每个字段中搜索一个字符串值。因此,如果我的字符串“queryValue”是“test”并且我的索引中有如下内容:
"hits": [
{
"_index": "sql-data",
"_type": "_doc",
"_id": "jTI5kHMBal-9d-PPo5Kr",
"_score": 1.0,
"_source": {
"Id": 57,
"object1": [
{
"description": "test",
}
],
"object2": [
{
"description": "nomore",
}
],
}
]
我想从我的查询中得到这个命中,因为 object1 的描述是测试。 那是我的代码,实际上 returns 我索引中的每个匹配项,而不仅仅是匹配的:
var searchResponse = client.SearchAsync<Document>(s => s
.Source(sf => sf
.IncludeAll())
.Query(p => p
.Match(s => s
.Query(queryValue)
)))
.Result;
有多种方法可以做到这一点。但其中每一项的可行性取决于您实际实现映射的方式。
使用 _all 字段
_all字段下的数据只做索引不存储。因此,您只能搜索数据但无法检索。使用 _all
有其自身的局限性,因为数据首先连接成一个字符串,然后进行分析和索引。因此,诸如部分匹配或任何特定分析器行为之类的事情可能是不可能的。为此,您可能需要指定一个自定义分析器来覆盖此行为。这实际上可能 膨胀 您的索引。最重要的是,您应该在编制索引时启用 _all
字段。除非有非常严格的要求并且使用旧版本的 ES,否则最好不要走这条路。 这在 6.0 版中已弃用并在 7.0 版中删除
使用multi_match
elasticsearch 的Multi-match 允许我们构建匹配多个字段的匹配查询。您可以在查询 DSL 中指定要搜索的所有字段。您可以创建一个如下所示的方法来执行多重匹配用法。
private static QueryContainer BuildMultiMatchQuery(string queryValue)
{
return new QueryContainerDescriptor<Document>()
.MultiMatch(c => c
.Fields(f => f
.Field(doc => doc.Field1)
.Field(doc => doc.Field2)
// other fields)
.Query(queryValue)
// Add other properties and configuration like analyzers you need, in this block
);
}
这可以按如下所示的方式添加到您的 searchAsync 调用链中
var searchResponse = client.SearchAsync<Document>(s => s
// ...other code
.Query(BuildMultiMatchQuery(queryValue))
// ...other code
).Result;
了解来自 here and about _all
from here
multi-match
查询
您可能还想看看 copy_to