在 ElasticSearch 中搜索包含破折号和 space 的子字符串
Search for sub string that contains dash and space in EleasticSearch
我有一个这样的模型:
public class PersonModel
{
public Guid Id { get; set; }
public PersonageType Type { get; set; }
public string Name { get; set; }
public string NationalCode { get; set; }
public string BourseCode { get; set; }
}
我正在尝试执行查询以过滤与每个 属性:
的子字符串匹配的数据
var result = await ElasticClient.SearchAsync<PersonModel>(sd => sd
.Index(IndexName)
.From((pagination.PageNumber - 1) * pagination.PageSize)
.Size(pagination.PageSize)
.Query(q =>
+q.Match(m => m.Field(f => f.Type).Query(typeValue)) &&
+q.Wildcard(w => w.Field(f => f.NationalCode).Value(nationalCode == null ? null : $"*{nationalCode}*")) &&
+q.Wildcard(w => w.Field(f => f.Name).Value(name == null ? null : $"*{name}*")) &&
+q.Wildcard(w => w.Field(f => f.BourseCode).Value(bourseCode == null ? null : $"*{bourseCode}*"))));
此查询工作正常,但当每个值包含 -
或 white space
时,将不会返回任何内容。例如,我有一个名为 john doe
的人,当 name
值为 hn d
时,搜索查询不起作用。
解决此问题的最简单方法是更改映射。
尝试如下操作:
PUT my-index-000001
{
"mappings": {
"properties": {
"NationalCode": {
"type": "keyword"
},
"Name": {
"type": "keyword"
},
"BourseCode": {
"type": "keyword"
},
}
}
}
然后重新索引您的数据。
了解更多信息:
https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html
我认为您使用的是文本字段数据类型。另外,如果您想使用匹配查询并享受它的好处,您可以同时输入以下内容:
PUT my-index-000001
{
"mappings": {
"properties": {
"NationalCode": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
然后您可以对 NationalCode
使用匹配查询,对 NationalCode.keyword
使用通配符查询
正如@hamid 所说 keyword
解决了问题,我将查询更改为:
var result = await ElasticClient.SearchAsync<PersonageSearchReadModel>(sd => sd
.Index(IndexName)
.From((pagination.PageNumber - 1) * pagination.PageSize)
.Size(pagination.PageSize)
.Query(q =>
+q.Match(m => m.Field(f => f.Type).Query(typeValue)) &&
+q.Wildcard(w => w.Field(f => f.NationalCode.Suffix("keyword")).Value(nationalCode == null ? null : $"*{nationalCode}*")) &&
+q.Wildcard(w => w.Field(f => f.Name.Suffix("keyword")).Value(name == null ? null : $"*{name}*")) &&
+q.Wildcard(w => w.Field(f => f.BourseCode.Suffix("keyword")).Value(bourseCode == null ? null : $"*{bourseCode}*"))));
我有一个这样的模型:
public class PersonModel
{
public Guid Id { get; set; }
public PersonageType Type { get; set; }
public string Name { get; set; }
public string NationalCode { get; set; }
public string BourseCode { get; set; }
}
我正在尝试执行查询以过滤与每个 属性:
的子字符串匹配的数据
var result = await ElasticClient.SearchAsync<PersonModel>(sd => sd
.Index(IndexName)
.From((pagination.PageNumber - 1) * pagination.PageSize)
.Size(pagination.PageSize)
.Query(q =>
+q.Match(m => m.Field(f => f.Type).Query(typeValue)) &&
+q.Wildcard(w => w.Field(f => f.NationalCode).Value(nationalCode == null ? null : $"*{nationalCode}*")) &&
+q.Wildcard(w => w.Field(f => f.Name).Value(name == null ? null : $"*{name}*")) &&
+q.Wildcard(w => w.Field(f => f.BourseCode).Value(bourseCode == null ? null : $"*{bourseCode}*"))));
此查询工作正常,但当每个值包含 -
或 white space
时,将不会返回任何内容。例如,我有一个名为 john doe
的人,当 name
值为 hn d
时,搜索查询不起作用。
解决此问题的最简单方法是更改映射。 尝试如下操作:
PUT my-index-000001
{
"mappings": {
"properties": {
"NationalCode": {
"type": "keyword"
},
"Name": {
"type": "keyword"
},
"BourseCode": {
"type": "keyword"
},
}
}
}
然后重新索引您的数据。
了解更多信息: https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html
我认为您使用的是文本字段数据类型。另外,如果您想使用匹配查询并享受它的好处,您可以同时输入以下内容:
PUT my-index-000001
{
"mappings": {
"properties": {
"NationalCode": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
然后您可以对 NationalCode
使用匹配查询,对 NationalCode.keyword
正如@hamid 所说 keyword
解决了问题,我将查询更改为:
var result = await ElasticClient.SearchAsync<PersonageSearchReadModel>(sd => sd
.Index(IndexName)
.From((pagination.PageNumber - 1) * pagination.PageSize)
.Size(pagination.PageSize)
.Query(q =>
+q.Match(m => m.Field(f => f.Type).Query(typeValue)) &&
+q.Wildcard(w => w.Field(f => f.NationalCode.Suffix("keyword")).Value(nationalCode == null ? null : $"*{nationalCode}*")) &&
+q.Wildcard(w => w.Field(f => f.Name.Suffix("keyword")).Value(name == null ? null : $"*{name}*")) &&
+q.Wildcard(w => w.Field(f => f.BourseCode.Suffix("keyword")).Value(bourseCode == null ? null : $"*{bourseCode}*"))));