3

これで、「Package」オブジェクトのインデックスが正常に作成され、簡単なテキストクエリが完全に機能しています。

部分的に入力されたオブジェクト(「パッケージ」タイプ)を検索の条件として使用できるかどうか/どのように使用できるか知りたいですか?

パッケージは次のようになります。

var packages =  new List<Package> {
            new Package {
                Name = "Maverick",
                TargetBusiness = new Business {
                    Industry = "Retail",
                    BusinessType = BusinessType.Product,
                    LocationType = LocationType.Store
                },
                Description = "Standard package for retail shops"
            },
            new Package {
                Name = "Goose",
                TargetBusiness = new Business {
                    Industry = "Retail",
                    BusinessType = BusinessType.Product,
                    LocationType = LocationType.Online
                },
                Description = "Standard package for ecommerce shops"
            },
            new Package {
                Name = "Viper",
                TargetBusiness = new Business {
                    Industry = "Advertising",
                    BusinessType = BusinessType.Service,
                    LocationType = LocationType.Office
                },
                Description = "Standard package test retail"
            }
        }

現在、クエリは次のようになっています。

var result = client.Search<Package>(x => x.Query(q => q.QueryString(qs => qs.Query("q=retail"))));

しかし、idは次のようなものが好きです:

var result = client.Search<Package>(x => x.Query(q => q.Object(new Package{...etc ...})));

私は理にかなっていると思います:Dよろしくお願いします

4

2 に答える 2

2
var result = client.Search<Package>(x => x.Query(q => q.Object(new Package{...etc ...})));

Nestはオブジェクトの各プロパティに使用するクエリのタイプを推測できないため(つまり、用語、プレフィックス、ワイルドカード、query_string など)、機能しません。

あなたの例では、クエリを に分割するq=retailため、のみ機能します。通常の lucene 構文を使用してフィールドをターゲットにすることができます。elasticsearchq OR retailtargetBusiness.industry:retail

Elasticsearch では、クエリ文字列がフィールドにバインドされていない場合、デフォルト_allで、オブジェクトのすべてのプロパティのすべての用語を持つフィールドが検索されます。そのため、本当に大量のデータがある場合、サポートをオフに_allすることは通常、非常に良い考えです。

Nestquery_stringには現在、部分的に満たされたオブジェクトを取り、elasticsearchクエリに変換できる機能はありません。

これがあなたのクエリであるかどうか言ってください:

client.Search<Package>(s=>s
    .From(0)
    .Size(10)
    .Filter(f=>
        f.Term(p=>p.TargetBusiness.Industry, "Advertising")
        && f.Exists(p=>p.Name)
    )
    .Query(q=>
       q.QueryString(qs=>qs
           .Query("ecommerce")
           .Operator(Operator.and)
       )
    )
)

上記の例では、パッケージに基づいてクエリ文字列クエリで検索するすべての用語を提供する独自のメソッドを作成する必要があります。

すなわち

public string MyPackageQueryString(Package package) 
{
    var myTerms = List<string>();
    myTerms.Add(package.Name);
    if (package.TargetBusiness != null)
    {
        myTerms.Add(package.Industry)
        ....
    }
    ...
    return string.Join(" ", myTerms.Where(t=>!string.IsNullOrWhiteSpace(t)));
}

その後

client.Search<Package>(s=>s
    .From(0)
    .Size(10)
    .Filter(f=>
        f.Term(p=>p.TargetBusiness.Industry, "Advertising")
        && f.Exists(p=>p.Name)
    )
    .Query(q=>
       q.QueryString(qs=>qs
           .Query(this.MyPackageQueryString(package))
           .Operator(Operator.or)
       )
    )
)
于 2012-11-11T14:27:21.847 に答える
0

それは本当に私を正しい軌道に乗せるのに役立ちました-結局、一種のクロスサーチのように見えました:私が望まなかった他のすべてのフィールドですべてのフィールドを検索しました。

結局(間違っている可能性があります)次のようになります:

return _searchClient.Search<Package>(s => s.Query(q => 
        q.Term("industry", criteriaPackage.TargetBusiness.Industry.ToLower()) ||
        q.Term("description", criteriaPackage.TargetBusiness.Description.ToLower()) ||
        q.Term("businessType",((int)criteriaPackage.TargetBusiness.BusinessType).ToString()) ||
        q.Term("locationType", ((int)criteriaPackage.TargetBusiness.LocationType).ToString()) ||
        q.Term("marketSegment", criteriaPackage.TargetBusiness.MarketSegment.ToLower()) ||
        q.Term("offer", criteriaPackage.TargetBusiness.Offer.ToLower()))
      ).Documents;

いくつかのユニットテストの後、私が望んでいた結果が得られたようです。

于 2012-11-12T15:19:32.400 に答える