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

时间:2016-05-26 17:54:04

标签: c# elasticsearch nest

我有一个班级

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

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

当我进行基于术语的查询时,我可以搜索AName.test1,结果也可以。假设我有更多其他属性的子字段。

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

有可能吗?如果是这样我怎么能用C#客户端NEST实现呢?

如果不清楚或似乎我没有努力,这是因为我的英语不好。我花了两天时间才发现,但我找不到怎么做,或者我不知道它是否可能。

我是一名弹性搜索新手,我现在大部分时间都在使用elasticsearch的文档消费,以找出有效处理事情的方式,所以我可以对字段进行搜索,但我觉得它会是如果我可以使用全文搜索更有效但我可能是错误的想法。再一次,我是新手。

谢谢。

编辑1:

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

让我举个例子: 假设我在name.sanalyzed子域中搜索“ bordo esarp ”并且“ esarp ”,并且name.sanalyzed中存在“ bordo ”嵌套属性中的一个文档(嵌套属性:'props',其属性为'name.sanalyzed')。

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

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

为了确保我的查询至少部分有效,我将查询字符串更改为“ esarp ”,我得到了name.sanalyzed中包含“esarp”的文档结果。

当我使用“ 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"))
));

我还有一个问题:我在不同的类中有很多名为“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"));

它似乎不再起作用。我正在尝试搜索产品名称上存在的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"}}}}'

结果示例:

“条款”:[“6821230”,“cardin”,“esarp”,“ipek”,“krep”,“pierre”,“saten”]

sanalyze分析仪的工作原理。我怎么知道? productName包含“Eşarp”作为值,使用sanalyze分析器保存为“esarp”。

所以我觉得我的查询错了。

1 个答案:

答案 0 :(得分:1)

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

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

df$new <- gsub('_.*', '', df$start)
df1$new <- ifelse(grepl('_', df1$Details), gsub('_.*', '', df1$Details), 
                                                   substring(df1$Details, 1, 4))

df1$Gene_ID <- sapply(df1$new, function(i) df$Gene_ID[match(i, df$new)])

df1
#   architecture_number                                       Details   new     Gene_ID
#1                    1         chr317678741767875EOG6HQF5814.8092+47  chr3 FBgn0245234
#2                    1         chr325176942517695EOG6NKCGX23.1869-87  chr3 FBgn0245234
#3                    1        chr391494069149407EOG6NZVDZ2.96183+105  chr3 FBgn0245234
#4                    1        chr246642624664263EOG6Z638J1.52323+138  chr2 FBgn0078093
#5                    1   chr4_group3231407231408EOG6QRHQP4.65431-721  chr4 FBgn0070413
#6                    1         chr311648221164823EOG6X3HNJ2.28484+96  chr3 FBgn0245234
#7                    1        chr333466933346694EOG66WZW582.1698+678  chr3 FBgn0245234
#8                    1 chrXR_group854636745463675EOG6XH0KP1.86172+57 chrXR FBgn0247618
#9                    1         chr283746518374652EOG6V17MG2.45409-68  chr2 FBgn0078093
#10                   1      chr31338293913382940EOG63XVQR1.60785+105  chr3 FBgn0245234

您还可以将client.Search<Project>(s => s .Query(q => q .Match(m => m .Field("field.subfield") .Query("the query") ) ) ); 扩展名方法与表达式

结合使用
.Suffix()