弹性搜索 - 使用C#在其中包含空格和特殊字符的字符串

时间:2015-04-30 06:04:16

标签: c#-4.0 elasticsearch couchbase nest

我正在寻找ElasticSearch嵌套查询,它将使用C#在其中包含空格的字符串上提供完全匹配。

例如 - 我想搜索像' XYZ公司解决方案'这样的词。我尝试了查询字符串查询但它给了我所有的记录,无论搜索结果如何。我也读了帖子,发现我们必须为该字段添加一些映射。我试过了“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#中有完整的示例或步骤,那么请您与我分享一下吗?

3 个答案:

答案 0 :(得分:1)

您是否尝试过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

答案 1 :(得分:1)

请参考以下代码,我认为这符合您的要求。 在这里,我使用动态模板创建并映射了索引,然后执行了XDCR。 现在所有的字符串字段都不会被分析。

 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

答案 2 :(得分:0)

看起来你只需要在重新索引操作之后刷新新索引。

使用您的代码示例(以及您的第一个术语查询),我看到了相同的结果 - 0次点击。

Refresh调用后添加以下reindex.Subscribe()调用会导致返回单个匹配:

objElasticClient.Refresh(new RefreshRequest() { });