Nest Elasticsearch 通配符查询用作查询字符串,但不适用于 fluent API
Nest Elasticsearch wildcard query works as querystring but not with fluent API
我的索引中有大约一百个测试文档,是使用 NBuilder 构建的:
[
{
"title" : "Title1",
"text" : "Text1"
},
{
"title" : "Title2",
"text" : "Text2"
},
{
"title" : "Title3",
"text" : "Text3"
}
]
我想用通配符查询它们以查找所有 "text" 以 "Text" 开头的项目。但是当我在 Nest 中使用两种通配符方法时,我得到了两个不同的结果。
var response = await client.SearchAsync<FakeFile>(s => s.Query(q => q
.QueryString(d => d.Query("text:Text*")))
.From((page - 1) * pageSize)
.Size(pageSize));
这 returns 100 个结果。但我正在尝试使用流利的 API 而不是查询字符串。
var response = await client.SearchAsync<FakeFile>(s => s
.Query(q => q
.Wildcard(c => c
.Field(f => f.Text)
.Value("Text*"))));
这 returns 0 个结果。我是 Elasticsearch 的新手。我试图让示例尽可能简单,以确保我能逐个理解它。我不知道为什么第二个查询没有返回任何内容。请帮忙。
假设您的映射看起来像这样:
{
"mappings": {
"doc": {
"properties": {
"title": {
"type": "text"
},
"text":{
"type": "text"
}
}
}
}
}
试试这个(值 应该是小写):
var response = await client.SearchAsync<FakeFile>(s => s
.Query(q => q
.Wildcard(c => c
.Field(f => f.Text)
.Value("text*"))));
或者这个(不知道f.Text上面有没有text属性:
var response = await client.SearchAsync<FakeFile>(s => s
.Query(q => q
.Wildcard(c => c
.Field("text")
.Value("text*"))));
Kibana 语法:
GET index/_search
{
"query": {
"wildcard": {
"text": {
"value": "text*"
}
}
}
}
假设您的文本字段是 text 类型,那么在索引期间,elasticsearch 会将 Text1
存储为 text1
内部倒排索引。使用查询字符串查询时会发生完全相同的分析,但使用通配符查询时则不会。
.QueryString(d => d.Query("text:Text*")))
查找 text*
并且 .Wildcard(c => c.Field(f => f.Text).Value("Text*")))
查找 Text*
但 elasticsearch 仅在内部存储第一个。
希望对您有所帮助。
我的索引中有大约一百个测试文档,是使用 NBuilder 构建的:
[
{
"title" : "Title1",
"text" : "Text1"
},
{
"title" : "Title2",
"text" : "Text2"
},
{
"title" : "Title3",
"text" : "Text3"
}
]
我想用通配符查询它们以查找所有 "text" 以 "Text" 开头的项目。但是当我在 Nest 中使用两种通配符方法时,我得到了两个不同的结果。
var response = await client.SearchAsync<FakeFile>(s => s.Query(q => q
.QueryString(d => d.Query("text:Text*")))
.From((page - 1) * pageSize)
.Size(pageSize));
这 returns 100 个结果。但我正在尝试使用流利的 API 而不是查询字符串。
var response = await client.SearchAsync<FakeFile>(s => s
.Query(q => q
.Wildcard(c => c
.Field(f => f.Text)
.Value("Text*"))));
这 returns 0 个结果。我是 Elasticsearch 的新手。我试图让示例尽可能简单,以确保我能逐个理解它。我不知道为什么第二个查询没有返回任何内容。请帮忙。
假设您的映射看起来像这样:
{
"mappings": {
"doc": {
"properties": {
"title": {
"type": "text"
},
"text":{
"type": "text"
}
}
}
}
}
试试这个(值 应该是小写):
var response = await client.SearchAsync<FakeFile>(s => s
.Query(q => q
.Wildcard(c => c
.Field(f => f.Text)
.Value("text*"))));
或者这个(不知道f.Text上面有没有text属性:
var response = await client.SearchAsync<FakeFile>(s => s
.Query(q => q
.Wildcard(c => c
.Field("text")
.Value("text*"))));
Kibana 语法:
GET index/_search
{
"query": {
"wildcard": {
"text": {
"value": "text*"
}
}
}
}
假设您的文本字段是 text 类型,那么在索引期间,elasticsearch 会将 Text1
存储为 text1
内部倒排索引。使用查询字符串查询时会发生完全相同的分析,但使用通配符查询时则不会。
.QueryString(d => d.Query("text:Text*")))
查找 text*
并且 .Wildcard(c => c.Field(f => f.Text).Value("Text*")))
查找 Text*
但 elasticsearch 仅在内部存储第一个。
希望对您有所帮助。