Elastic Search-使用C#搜索其中包含空格和特殊字符的字符串
Elastic Search-Search string having spaces and special characters in it using C#
我正在寻找 ElasticSearch 嵌套查询,它将使用 C# 提供包含空格的字符串的精确匹配。
例如 - 我想搜索像 'XYZ Company Solutions' 这样的词。我尝试了 querystring 查询,但无论搜索结果如何,它都会给我所有记录。我还阅读了 post 并发现我们必须为该字段添加一些映射。我在现场尝试了 'Not_Analyzed' 分析仪,但仍然没有用。
这是我的C#代码
var indexDefinition = new RootObjectMapping
{
Properties = new Dictionary<PropertyNameMarker, IElasticType>(),
Name = elastic_newindexname
};
var notAnalyzedField = new StringMapping
{
Index = FieldIndexOption.NotAnalyzed
};
indexDefinition.Properties.Add("Name", notAnalyzedField);
objElasticClient.DeleteIndex(d => d.Index(elastic_newindexname));
var reindex = objElasticClient.Reindex<dynamic>(r => r.FromIndex(elastic_oldindexname).ToIndex(elastic_newindexname).Query(q => q.MatchAll()).Scroll("10s").CreateIndex(i => i.AddMapping<dynamic>(m => m.InitializeUsing(indexDefinition))));
ReindexObserver<dynamic> o = new ReindexObserver<dynamic>(onError: e => { });
reindex.Subscribe(o);**
**ISearchResponse<dynamic> ivals = objElasticClient.Search<dynamic>(s => s.Index(elastic_newindexname).AllTypes().Query(q => q.Term("Name","XYZ Company Solutions")));** //this gives 0 records
**ISearchResponse<dynamic> ivals1 = objElasticClient.Search<dynamic>(s => s.Index(elastic_newindexname).AllTypes().Query(q => q.Term(u => u.OnField("Name").Value("XYZ Company Solutions"))));** //this gives 0 records
**ISearchResponse<dynamic> ivals = objElasticClient.Search<dynamic>(s => s.Index(elastic_newindexname).AllTypes().Query(@"Name = 'XYZ Company Solutions'"));** //this gives all records having fields value starting with "XYZ"
如果有人有完整的 C# 示例或步骤,可以与我分享吗?
看来您只需要在重新索引操作后刷新新索引即可。
使用您的代码示例(和您的第一个术语查询),我看到了相同的结果——0 次匹配。
在 reindex.Subscribe()
调用后添加以下 Refresh
调用会导致返回单个命中:
objElasticClient.Refresh(new RefreshRequest() { });
您是否尝试过 match_phrase 查询?
查询 DSL 请求如下:
"query": {
"match_phrase": {
"title": "XYZ Company Solutions"
}
}
在 C# 中尝试以下操作:
_client.Search<T>(s => s
.Index(IndexName)
.Types(typeof (T))
.Query(q => q.MatchPhrase(m => m
.OnField(f => f.Name)
.Query("XYZ Company Solutions"))));
查看官方文档了解更多信息:
http://www.elastic.co/guide/en/elasticsearch/guide/master/phrase-matching.html#phrase-matching
请参考下面的代码,我认为这将满足您的要求。
在这里,我使用动态模板创建并映射了索引,然后执行了 XDCR。
现在所有字符串字段都将是 not_analysed.
IIndicesOperationResponse result = null;
if (!objElasticClient.IndexExists(elastic_indexname).Exists)
{
result = objElasticClient.CreateIndex(elastic_indexname, c => c.AddMapping<dynamic>(m => m.Type("_default_").DynamicTemplates(t => t
.Add(f => f.Name("string_fields").Match("*").MatchMappingType("string").Mapping(ma => ma
.String(s => s.Index(FieldIndexOption.NotAnalyzed)))))));
}
谢谢
Mukesh Raghuwanshi
我正在寻找 ElasticSearch 嵌套查询,它将使用 C# 提供包含空格的字符串的精确匹配。
例如 - 我想搜索像 'XYZ Company Solutions' 这样的词。我尝试了 querystring 查询,但无论搜索结果如何,它都会给我所有记录。我还阅读了 post 并发现我们必须为该字段添加一些映射。我在现场尝试了 'Not_Analyzed' 分析仪,但仍然没有用。
这是我的C#代码
var indexDefinition = new RootObjectMapping
{
Properties = new Dictionary<PropertyNameMarker, IElasticType>(),
Name = elastic_newindexname
};
var notAnalyzedField = new StringMapping
{
Index = FieldIndexOption.NotAnalyzed
};
indexDefinition.Properties.Add("Name", notAnalyzedField);
objElasticClient.DeleteIndex(d => d.Index(elastic_newindexname));
var reindex = objElasticClient.Reindex<dynamic>(r => r.FromIndex(elastic_oldindexname).ToIndex(elastic_newindexname).Query(q => q.MatchAll()).Scroll("10s").CreateIndex(i => i.AddMapping<dynamic>(m => m.InitializeUsing(indexDefinition))));
ReindexObserver<dynamic> o = new ReindexObserver<dynamic>(onError: e => { });
reindex.Subscribe(o);**
**ISearchResponse<dynamic> ivals = objElasticClient.Search<dynamic>(s => s.Index(elastic_newindexname).AllTypes().Query(q => q.Term("Name","XYZ Company Solutions")));** //this gives 0 records
**ISearchResponse<dynamic> ivals1 = objElasticClient.Search<dynamic>(s => s.Index(elastic_newindexname).AllTypes().Query(q => q.Term(u => u.OnField("Name").Value("XYZ Company Solutions"))));** //this gives 0 records
**ISearchResponse<dynamic> ivals = objElasticClient.Search<dynamic>(s => s.Index(elastic_newindexname).AllTypes().Query(@"Name = 'XYZ Company Solutions'"));** //this gives all records having fields value starting with "XYZ"
如果有人有完整的 C# 示例或步骤,可以与我分享吗?
看来您只需要在重新索引操作后刷新新索引即可。
使用您的代码示例(和您的第一个术语查询),我看到了相同的结果——0 次匹配。
在 reindex.Subscribe()
调用后添加以下 Refresh
调用会导致返回单个命中:
objElasticClient.Refresh(new RefreshRequest() { });
您是否尝试过 match_phrase 查询?
查询 DSL 请求如下:
"query": {
"match_phrase": {
"title": "XYZ Company Solutions"
}
}
在 C# 中尝试以下操作:
_client.Search<T>(s => s
.Index(IndexName)
.Types(typeof (T))
.Query(q => q.MatchPhrase(m => m
.OnField(f => f.Name)
.Query("XYZ Company Solutions"))));
查看官方文档了解更多信息:
http://www.elastic.co/guide/en/elasticsearch/guide/master/phrase-matching.html#phrase-matching
请参考下面的代码,我认为这将满足您的要求。 在这里,我使用动态模板创建并映射了索引,然后执行了 XDCR。 现在所有字符串字段都将是 not_analysed.
IIndicesOperationResponse result = null;
if (!objElasticClient.IndexExists(elastic_indexname).Exists)
{
result = objElasticClient.CreateIndex(elastic_indexname, c => c.AddMapping<dynamic>(m => m.Type("_default_").DynamicTemplates(t => t
.Add(f => f.Name("string_fields").Match("*").MatchMappingType("string").Mapping(ma => ma
.String(s => s.Index(FieldIndexOption.NotAnalyzed)))))));
}
谢谢
Mukesh Raghuwanshi