2017-04-19 2 views
2

NameDescriptionフィールドのドキュメントを持つ。 Name持つ多くの重量Description検索をより自然にするには?

私はこのようなスコアが注文した文書を取得したい:

  1. 完全一致
  2. 部分一致
  3. ファジーマッチ
  4. ファジィ部分一致
  5. 近接用語スコアが高くなります。

私は私が望むものに似た何かを得るために、この手術をやっている:

public Task<DocumentSearchResult<T>> SearchWithFuzzyAsync<T>(string searchTerm, SearchParameters sp) where T: class 
{ 
sp.SearchMode = SearchMode.All; 
sp.QueryType = QueryType.Full; 
searchTerm = Sanitize(searchTerm).Trim(); 
var keywordTrimmedFuzzy = searchTerm.Replace(" ", "~ "); 
if (string.IsNullOrWhiteSpace(searchTerm)) 
{ 
    return Task.FromResult(new DocumentSearchResult<T>()); 
} 
var searchTerms = $"({searchTerm}) 
     || ({keywordTrimmedFuzzy}~) 
     || ({keywordTrimmedFuzzy}*)^0.8"; 
return indexClient.Documents.SearchAsync<T>(searchTerms, sp); 

は、私が何かをしないのですか私はいくつかのまともな結果を得るために事のこのタイプを構築する必要がありますか?

このアプローチで見られる問題は、コードを管理しない限り、ユーザーに検索エンジンを使用させることができないということです(使用するオプションや高度な構文など)。代わりにグラグラ検索文字列を作成する

sp.UseFuzzySearch = true; 
sp.UsePartialMatch = true; 
sp.ProximityTreshold = 4; 
indexClient.Documents.SearchAsync<T>(term, sp); 

:あなたのような何かを行うことができれば

は、それが簡単ではないでしょうか?私は何が欠けていますか?

答えて

0

現在、クエリー言語をユーザーに公開したくない場合は、ファジーおよび/または部分一致を含めるようにユーザークエリを書き直すことをお勧めします。

私は、これらの変換の一部を実行した構成可能なクエリパーサーがうまくいくことに同意します。興味深いことに、多くのお客様がそれをリクエストしているわけではありません。優先度を高めるためにUserVoiceアイデアを作成してください。

フィールドの相対的重要性(フィールドブースティング)は、Scoring Profilesで定義できます。したがって、[名前]フィールドの重みを大きくしたい場合は、検索クエリを書き換える必要はありません。

ワイルドカードとプレフィックスのクエリは、ドキュメント全体のスコアに常に一定のスコアを与えます。詳細については、How full text search works in Azure Searchの記事のスコアセクションを参照してください。

+0

私はスコアリングプロファイルを使用しています(言及するのを忘れました)。あなたの注釈が明確でないのは、ここで '({keywordTrimmedFuzzy} *)^ 0.8'を使用している'^0.8 'が結果に影響を及ぼしているかどうかです。 –

+0

私は、この機能を要求していない簡単なテストの他に、紺碧の検索を使用している人を想像するのは難しいと思う。もしそれがなければ、タイトルが 'Bart'で、' Bar'や 'Bart *'を検索してもそのアイテムは返されません。私はなぜ最後のものがバグではなく設計によるのか分からない。 –

+0

https://feedback.azure.com/forums/263029-azure-search/suggestions/11112582-support-prefix-matching-for-suggestions 13投票があり、同様の問題を指摘しています。 –

関連する問題