c# - 需要知道如何使用 c# 在数组中搜索来在 ES 中进行搜索

标签 c# arrays elasticsearch

您好,我是 ElasticSearch 的新手,需要帮助。我正在使用 c#(我认为我可以在 String 中使用 QueryRaw ...)。 场景下方:

数据

{
    "id": "1",
    "title": "Small cars",
    "tagsColours": ["grey",
    "black",
    "white"],
    "tagsCars": ["Suzuki",
    "Ford"],
    "tagsKeywords": []
},
{
    "id": "2",
    "title": "Medium cars",
    "tagsColours": [],
    "tagsCars": ["VW",
    "Audi",
    "Peugeot"],
    "tagsKeywords": ["Sedan"]
},
{
    "id": "3",
    "title": "Big cars",
    "tagsColours": ["red",
    "black"],
    "tagsCars": ["Jeep",
    "Dodge"],
    "tagsKeywords": ["Van",
    "Big"]
}

目标

我想根据用户的选择对标签列应用过滤器。这些值将填充到带有选定值的 tagsXXX 数组列中。

  • 如果参数数组值不为空,则结果应至少包含一个实例。每个参数数组都相同。参数值越多,搜索越具体
  • 如果至少有一个来自参数的值与任何文档的标记列数组中的所有值相匹配,则获取该文档。 但如果另一个 tagsXXX 数组上有另一个值,那么它应该考虑到它。
  • 如果标签参数数组没有值,则忽略该过滤器

期望的响应

A) 如果用户仅选择 1 个标签颜色(即=黑色),格式如下:

{
    id: "",
    title: "",
    tagsColours: ["black"],
    tagsCars: [],
    tagsKeywords: []
}

我想获取 Id=2 和 id=3 的文档,因为它们的 tagColours 中有黑色并且忽略 tagsCars 和 tagsKeywords,因为参数上没有值

B) 如果用户仅选择 2 个差异标签(即 = colour=black 和 cars= audi 和 mercedez benz),格式如下:

{
    id: "",
    title: "",
    tagsColours: ["black",
    "yellow"],
    tagsCars: ["Audi",
    "Mercedes Benz"],
    tagsKeywords: []
}

我想获取 id=2 的文档,因为它在 tagsColours 上发现了黑色,在 tagsCars 中发现了 Audi,并且它不应该提取 id=1 的文档,因为 即使黑色在 tagsColours 上,其 tagsCars 值上也没有任何参数值(audi、mercedez benz)

大家好,当我尝试在 ElasticSearch 上搜索并在具有值的数组中查找时,以及当参数没有值时,我遇到了问题。 如果有人可以帮助我解决这个问题,我将不胜感激。 我这样做了:

termsQuery = Query<StructuredData>.Terms(t => t.Field(f =>f.TagsColours).Terms(dataToSearch.TagsColours));
termsQuery = termsQuery && Query<StructuredData>.Terms(t => t.Field(f =>f.TagsCars).Terms(dataToSearch.TagsCars));

我停在这里(没有添加第三个过滤器)因为我不能将两个过滤器混合在一起 dataToSearch 具有来自参数的值(相同的结构对象,因为 .Search 让我在这里这样做 .Search()

var settings = new ConnectionSettings(node);

var response = new ElasticClient(settings)
.Search<StructuredData>(
s => s.AllIndices()
.AllTypes()
.From(0)
.Size(50)
.Query(_ => termsQuery)
);

但是我在使用超过 1 个过滤器时遇到问题.. 有任何想法吗? “.Terms”是正确的属性吗?

最佳答案

如果您在 ES 5 上使用常规映射 > 这将得到您想要的结果。如果不是,您将需要更改映射。

 QueryContainer query = null;

            if(dataToSearch.TagsColours != null && dataToSearch.TagsCars.Length > 0)
            {
                query = Query<StructuredData>.Terms(t=>t.Field("tagsColours.keyword").Terms(dataToSearch.TagsColours));
            }

            if(dataToSearch.TagsColours != null && dataToSearch.TagsCars.Length > 0)
            {
                var q =  Query<StructuredData>.Terms(t=>t.Field("tagsCars.keyword").Terms(dataToSearch.TagsCars));
                query = query == null ? q : query && q; 
            }

            if(dataToSearch.TagsKeywords != null && dataToSearch.TagsKeywords.Length > 0)
            {
                var q =  Query<StructuredData>.Terms(t=>t.Field("tagsKeywords.keyword").Terms(dataToSearch.TagsKeywords));
                query = query == null ? q : query && q; 
            }

您遇到的问题是术语查询是在非分析值上完成的,默认文本字段使用标准分析器。从 5 开始,他们添加了使用关键字分析器的关键字子字段,它基本上只是按原样放置术语,您可以按原始值进行搜索。标准分析器对单词进行标记化并将所有术语小写,因此无法找到 Audi,因为该术语是 audi。如果你只想小写输入字符串,这不会解决梅赛德斯奔驰问题,因为在标准术语中,这将变成 mercedes a benz terms 两个术语而不是一个换句话说,如果你输入 mercedes 或 benz 而不是 mercedes,术语将返回结果奔驰。如果您想使用匹配查询进行不区分大小写的搜索,您需要添加自定义分析器。

关于c# - 需要知道如何使用 c# 在数组中搜索来在 ES 中进行搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45304493/

相关文章:

javascript - 动态将从 Controller 返回的选择框值呈现为 json

c# - 静态方法不能实现接口(interface)方法,为什么?

elasticsearch - 如何从搜索结果中获取所有值

curl - 如何在Logstash中将事件标记为 “Looked At”

c# - .NET DLL 是静态链接还是动态链接?

c - 如何在 C 中检查用户输入的长度?

c++ - 将相似的变量存储在数组中有什么好处吗?

c++ - 从 VB6 调用的 C++ DLL 函数中的输出数组参数

Elasticsearch 2.0 : how to delete by query in Java

c# - Visual Studio 扩展获取项目路径