2017-05-08 8 views
0

Nestライブラリのバージョン5.3.1を使用してElasticSearchインデックスデータの設定と部分検索を行っています。依存関係; Elasticsearch.Net)。以下に示すように、私はデータを使用し、オンラインで見つけ提案を1としてNestを使用したElasticSearch:クエリ<>を使用した複数の単語を使用した部分検索ワイルドカード

は、インデックス付きプロパティの一部にアナライザの種類を指定する属性:

public class Article 
    { 
     public int Id { get; set; } 
     [Completion(Analyzer = "standard", PreservePositionIncrements = true, PreserveSeparators = true)] 
     public string Title { get; set; } 
     public string Url { get; set; } 
    } 

私は「条」タイプの検索インデックス内の少なくとも1つのレコード持っています"The greatest ...."で始まるタイトル。以下のコードを使用してキーワード「最大」の部分検索を実行すると、一致する検索結果を返すだけでうまく動作します。

MultiTermQueryRewrite multiqueryRewrite = null; 
var searchQuery = Query<Article>.Wildcard(f => f.Title, "*greatest*", rewrite: multiqueryRewrite); 

var client = ElasticsearchClient.GetClient<Article>(); 
return client.Search<Article>(s => s.Query(searchQuery)); 

しかし、下記のバリエーションのある「最高の」キーワードを検索しようとすると、結果が戻ってこない。

var searchQuery = Query<Article>.Wildcard(f => f.Title, "*the greatest*", rewrite: multiqueryRewrite); 

または

var searchQuery = Query<Article>.Wildcard(f => f.Title, "*the*greatest*", rewrite: multiqueryRewrite); 

あるいは

var searchQuery = Query<Article>.Wildcard(f => f.Title, "*the?greatest*", rewrite: multiqueryRewrite); 

私はElasticSearch製品に新しいですので、任意の助けをいただければ幸いです。

ご協力いただきありがとうございます。

答えて

1

ドキュメントを1としてワイルドカードは、ワイルドカード表現( を解析していない)に一致するフィールドを持つ文書を照合します。

タイトルフィールドはAnalyzedなので、インデックスを取得する前にトークン化されます。テキストの中には、The Greatestがトークン化され、小文字に変換されるものがあります(Behavior Of Standard Analyzer)。したがって、それは2つのトークンthegreatestとして逆索引に格納されます。

*greatest*を検索すると、これに対応するトークンがあるので、検索されます。

しかし、* the greatest *を検索すると、このテキストを含むトークンがないため、検索されません。

あなたは、この情報がお役に立てば幸いQuery String

var searchQuery = Query<Article>.QueryString(c => c 
.Query("*the greatest*") 
.DefaultField(p=>p.Title)) 

を使用することができます!

+0

あなたの返信ありがとうございます@リチャ、私はそれが非常に便利だと思った。あなたの提案に基づいて、私は一致結果に "the"と "greatest"の両方の単語が存在することを保証するためだけに、 "Default Operator"を追加指定する必要がありました。 'クエリ

。QueryString(qs => qs.Query(term).DefaultField(f => f.Title).DefaultOperator(Operator.And)); ' –

0

タイトルフィールドに適用された標準アナライザは、[The、greatest]という形式で "The Greatest"タイトルの小文字の用語を生成します。 Keyword Analyzerの使用を検討することもできますが、単語の入力を処理する必要がありますのでご注意ください。

+0

この提案はありがとう@JoanieBrar –

関連する問題