カスタムLuceneインデックスとLinqを使用してSitecore 7.2を使用しています。私は正確なマッチに追加の(最大)ウェイトを与える必要があります。Sitecore ContentSearch APIとのフレーズ一致
例:「どこか虹の彼方に」の ユーザー検索
結果は、単語「虹」を含む項目を含める必要がありますが、「どこか虹の彼方に」正確な全体の用語を含む項目が与えられるべきです最大重量。彼らはユーザーに最高の結果として表示されます。すなわち、フレーズ全体を含むアイテムは、「レインボー」という単語を100回含むアイテムよりも重くなるはずである。
「ワイルドカードの一致」とは別に「フレーズ一致」を収集することで、ContentSearch APIの外部でランキングロジックを処理する必要があるかもしれません。
ここに私の既存コードがありますが、簡潔にするために切り捨てられています。コードは機能しますが、完全なフレーズ一致は私の説明どおりに処理されません。
using (var context = ContentSearchManager.GetIndex("sitesearch-index").CreateSearchContext())
{
var pred = PredicateBuilder.False<SearchResultItem>();
pred = pred
.Or(i => i.Name.Contains(term)).Boost(1)
.Or(i => i["Field 1"].Contains(term)).Boost(3)
.Or(i => i["Field 2"].Contains(term)).Boost(1);
IQueryable<SearchResultItem> query = context.GetQueryable<SearchResultItem>().Where(pred);
var hits = query.GetResults().Hits;
...
}
にはどうすれば正確なフレーズマッチングを行うことができ、それがSitecore.ContentSearch.Linq APIで可能ですか?
PredicateBuilderではなくPreparedQueryの使用法を見てみましょう。 – Anton
PreparedQueryはSitecore 6のSitecore.Search APIのもので、ContentSearch APIは7ではないようです。私の現在のカスタムインデックスは、ノードのスタンドアロン設定ファイルで定義されています。 SearchManager.GetIndex()(v6で使用)は自分のインデックスを認識していません。 v6 APIを使用するためにはすべてを変更する必要があるようです。代替のために願っています。 –
betitall