2017-03-16 14 views
0

私はウェブサイトのリストにインデックスを作成しており、URLはウェブサイトのプロパティの1つです(名前、場所は他のものです)。私はurl/sを使ってウェブサイトを検索したい。私はこのプロパティを分析したくないし、完全なURL(キーワード)を検索したいと思う。だから私のコードはこのように見えます。Index = trueの属性キーワードは検索で失敗します

[Keyword(index = true)] 
public IEnumerable<string> Urls {get; set;} 

インデックスが作成されるとマッピングは、以下の、 "のURL" のようになります。{ "タイプ": "キーワード"}しかし

を、私はURLを検索する場合、「WWWを言います.yahoo.com "の場合、結果は返されません。 2つの質問:

a)なぜドキュメントを返さないのですか?それは簡単なキーワード検索なので、一致を返す必要があります。

b)デフォルトのアナライザを使用してインデックスを作成するのと同じことをしていますか?私の意見では、分析しないキーワードの検索は「明示的」で、おそらくより高速です。

ありがとうございました。

PS:私の検索コードでは、Nest(v5.0.0.0)を次のように使用しています。

public SearchResult<Website> Search(string qry, int page, int pageSize) 
{ 
    var result = client.Search<Website>(x => x.Query(q => q.MultiMatch(mp => mp.Query(qry).Fields(f => f.Fields(f1 => f1.Name, f2 => f2.Urls, f3 => f3.Locations)))).Size(pageSize)); 

    return new SearchResult<Website> 
    { 
     Results = result.Documents 
    }; 
} 
+1

あなたはどのように検索していますか、あなたがやっている検索リクエストを表示できますか?私は、クエリ入力の分析を実行するフルテキストクエリを使用していると思われる –

+0

検索コードが追加されました。私はあなたが正しいと思います。私の検索コードが解決する低レベルのクエリはおそらくフルテキストを使用しています。しかし、あなたの確認を待つでしょう。どのような低レベルのクエリがESに送られたかを正確に見る方法はありますか?ありがとう。 – Redzon

答えて

1

フルテキストクエリ、すなわち一致クエリとしてtype=keywordでフィールドを照会するとき、それはアナライザの設定にsearch_analyzerたデフォルトを使用しています。

インデックス時、Elasticsearchがこの順にアナライザを探します:

  • フィールドマッピングで定義されたアナライザを。
  • インデックス設定のデフォルトアナライザです。
  • 標準アナライザです。

は、クエリ時には、さらにいくつかの層があります:

  • フルテキストクエリで定義されたアナライザ。
  • フィールドマッピングで定義されたsearch_analyzer。
  • フィールドマッピングで定義されたアナライザ。
  • インデックス設定のdefault_searchというアナライザ。
  • インデックス設定のデフォルトアナライザです。
  • 標準アナライザです。

あなたが持っていないと仮定すると、上記の、そしてあなたのクエリの入力は、特定の区切り文字

に基づいて、それは分割せ standard analyzerによって分析されている定義された

FIX:

  1. 更新フィールドのマッピング[search_analyzer][2]
  2. Keyword Analyzerへの使用のためのterm query
+0

ありがとうございます。私のような、ESを使い始めている人にとっては非常に有益な情報です。 – Redzon

+0

あなたがそれを気に入ってよかったです。あなたの問題を解決しましたか? – Rahul

+1

@Redzonはまだ 'keyword'型としてマップしたいと思うかもしれませんが、おそらく正規化子を小文字に追加しています:https://www.elastic.co/guide/en/elasticsearch/reference/current/normalizer.html。次に、 –

関連する問題