2016-05-26 51 views
-1

私はクラスはフルテキスト検索でサブフィールドを含める方法はありますか?

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

が、私は別のアナライザを使用すると、私はelasticsearchインデックスに文書を取り込むとき、すべてがOKである「TEST1」という名前のANAMEのサブフィールドを持っていると言うことができますがあります。

用語ベースのクエリを実行すると、AName.test1を検索することができ、結果も正常です。他のプロパティのサブフィールドがいくつかあるとします。

ここでは、全文検索を使用し、これらのサブフィールドに対してもプロパティ自体に沿って検索できるようにしたいと考えています。

可能ですか?それがどうすればC#クライアントNESTでそれを達成できますか?

私が努力していないか不明瞭な場合は、私の貧しい英語のためです。私は見つけ出すのに2日を費やしますが、それを行う方法を見つけることができないか、それが可能かどうかわかりません。

私はelasticsearch初心者です。最近、elasticsearchのドキュメントのほとんどの時間を消費しています。効率的なやり方は何かを理解するためにフィールドを検索することができますが、フルテキスト検索を使用することができればより効率的ですが、私はそのような考え方が間違っている可能性があります。再び、私は初心者です。

ありがとうございます。

EDIT 1:

私は、クエリのフィールドメソッドを使用していたと私はそれがために動作させることができませんでしたねサブフィールドの代わりにプロパティ値で検索するように私の検索クエリを変更しますが、そうするためにネストされたプロパティのサブフィールド。

例を挙げましょう: は、私は「ボルドーのesarp」と検索だと言うことができます「esarpは」name.sanalyzedサブフィールドに存在し、「ボルドーは」のname.sanalyzedに存在しますネストされたプロパティ(ネストされたプロパティ: 'props'、そのプロパティは 'name.sanalyzed')内のドキュメントの1つ。

私は両方の単語を持っている結果のみを持っていることを確認するために、「を」演算子を使用しています(「ボルドー」+「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")) 
)); 

私は1つの以上の質問があります:私は別のクラスで「名前」と呼ばれる財産の多くを持っています。差をつけるために属性オプションとして名前を付ける必要がありますか?それは何に影響を与えますか?

EDIT 2:再び動作するようには思えない

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

... 
.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"))))); 

AND検索が同様に行われます。 productnameに存在するeşarpまたはesarpを検索しようとしていますが、結果はありません。もし私がbirdoを探していれば、それは何の役目もしません。

私は何が間違っていますか?

EDIT 3:

私は商品名フィールドのカールを持つクエリでインデックスどんな用語チェックし、インデックス付きの用語はOKです。

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

結果サンプル:

"という用語は": "6821230"、 "カルダン"、 "esarp"、 "イペック"、 "krep"、 "ピエール"、 "saten"]

sanalyze analyzerが動作します。どのように私は知っていますか? productNameには値として "Eşarp"が含まれ、sanalyzeアナライザでは "esarp"として保存されます。

私の質問は間違っていると思います。

答えて

1

はい、NEST-take a look at the Property Inference documentationでサブフィールド/マルチフィールドを検索できます。

あなたはまた、私はフィールドをしようとするつもりだ表現

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

と一緒に.Suffix()拡張メソッドを使用することができ、サブフィールドに

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

を参照するために、文字列を使用することができます。接尾辞の方法。もう一度@RussCamありがとうございます。 – zokkan

+0

@ zokkan問題なし:) –

+0

私はあなたの答えが間違っていると思います。私は、すべてのプロパティを別々に書く必要なしに、すべてのプロパティのsuffixを「サブフィールド」のサフィックスで検索できるようにしたいと考えています。 QuoteFieldSuffix拡張メソッドがありますが、それが私が探しているものかどうかわかりません。 – zokkan

関連する問題