有没有办法在全文搜索中包含子字段?

is there a way to include sub fields with full text search?

我有一个class

public class A {
    public string AName;
    public string BName;
    public string CName;
    public string DName;
    //some nested classes, etc..
}

假设我有一个名为 "test1" 的 AName 子字段,它使用另一个分析器,当我将文档填充到 elasticsearch 索引中时,一切正常。

当我进行基于词条的查询时,我可以搜索 AName.test1,结果也不错。可以说我还有其他属性的更多子字段。

现在,我想使用全文搜索并希望能够沿着属性本身搜索这些子字段。

可能吗?如果是,我如何使用 C# 客户端 NEST 实现它?

顺便说一句,如果不清楚或者好像我没有努力,那是因为我的英语不好。我花了 2 天的时间来找出答案,但我不知道该怎么做,或者我什至不知道是否可行。

我是一个 elasticsearch 新手,这些天我大部分时间都花在 elasticsearch 的文档上,以找出有效做事的方式,所以我可以对字段进行搜索,但我感觉到它如果我可以使用全文搜索,效率会更高,但我这样想可能是错误的。再说一次,我是新手。

谢谢。

编辑 1:

我将搜索查询更改为在子字段中搜索而不是在 属性 值中搜索,但为此我必须使用查询的字段方法,我想我无法使其适用于嵌套 属性 子字段。

举个例子: 假设我正在搜索“bordo esarp”和“esarp”存在于 name.sanalyzed 子字段和“bordo " 存在于嵌套 属性 中的其中一个文档的 name.sanalyzed 中(嵌套 属性: 'props',其 属性 是 'name.sanalyzed').

我正在使用运算符“AND”来确保我只有包含两个词的结果 ("bordo" + "esarp").

我有一个文档要匹配,但查询没有结果。

为了确保我的查询至少部分有效,我将查询字符串更改为“esarp”,并且我得到了 "esarp" 在 [=109] 中的文档结果=].

当我用“bordo”(存在于嵌套 属性 的 属性 的子字段中)执行相同的查询时,我有没有结果,所以我想我的查询写错了。

我的查询是:

q &= Query<ProductModel>.QueryString(t => t
    .Query(Keyword)
    .DefaultOperator(Nest.Operator.And)
    .Fields(u=>u
    .Field(z=>z.ProductCode.Suffix("sanalyzed"))
    .Field(z=>z.ProductName.Suffix("sanalyzed"))
    .Field(z=>z._CategoryModel.CategoryName.Suffix("sanalyzed"))
    .Field(z=>z.Brand.BrandName.Suffix("sanalyzed"))
    .Field(z=>z.UnionProperties.First().Name.Suffix("sanalyzed"))
    .Field(z=>z.UnionProperties.First().Options.First().Name.Suffix("sanalyzed"))
));

我还有一个问题:我有很多 属性 在不同的 class 中称为 "Name"。我是否应该为他们提供名称作为属性选项以有所作为?有什么影响吗?

编辑 2:

...
.Map<Yaziylabir.Extensions.TagManagement.Models.TagModel>(m => m.AutoMap().Properties(p => p
    .String(s => s
    .Name(n => n.Tag).Analyzer("sanalyze")))))
.Settings(s => s
    .Analysis(ans => ans
        .Analyzers(anl => anl
            .Custom("sanalyze", c => c
                .Tokenizer("standard")
                .Filters("lowercase", "asciifolding")))));

并且搜索是这样完成的:

q &= Query<ProductModel>.QueryString(t => t.Query(Keyword).Analyzer("sanalyze"));

好像又不行了。我正在尝试搜索 productname 上存在的 eşarp 或 esarp,但没有结果。如果我搜索没有任何拨号字符的 bordo,它会起作用并得到结果。

我错过了什么?

编辑 3:

我检查了使用 curl for productName 字段的查询索引了哪些术语,索引术语没问题。

 curl 'http://localhost:9200/bygulay/product/_search?pretty' -d '{"query":{"match_all":{}},"script_fields":{"terms":{"script":"doc[field].values","params":{"field":"productName"}}}}'

结果样本:

"terms" : [ "6821230", "cardin", "esarp", "ipek", "krep", "pierre", "saten" ]

sanalyze 分析器工作。我怎么知道? productName 包含 "Eşarp" 作为值,并使用 sanalyze 分析器将其保存为 "esarp".

所以我认为我的查询是错误的。

是的,您可以使用 NEST - take a look at the Property Inference documentation 搜索 sub-fields/multi_fields。

您可以使用字符串来引用子字段

client.Search<Project>(s => s
    .Query(q => q
        .Match(m => m
            .Field("field.subfield")
            .Query("the query")
        )
    )
);

您还可以将 .Suffix() 扩展方法与表达式结合使用

client.Search<Project>(s => s
    .Query(q => q
        .Match(m => m
            .Field(f => f.Field.Suffix("subfield"))
            .Query("the query")
        )
    )
);