2016-06-14 5 views
9

カスタム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で可能ですか?

+0

PredicateBuilderではなくPreparedQueryの使用法を見てみましょう。 – Anton

+1

PreparedQueryはSitecore 6のSitecore.Search APIのもので、ContentSearch APIは7ではないようです。私の現在のカスタムインデックスは、ノードのスタンドアロン設定ファイルで定義されています。 SearchManager.GetIndex()(v6で使用)は自分のインデックスを認識していません。 v6 APIを使用するためにはすべてを変更する必要があるようです。代替のために願っています。 – betitall

答えて

0

は自分の質問に答えます。問題はかっこの構文にありました。これは、ブーストが観測されていませんでした

.Or(i => i.Name.Contains(term).Boost(1)) 

ではなく

.Or(i => i.Name.Contains(term)).Boost(1) 

でなければなりません。

0

あなたはそれが、この解決する次の手順を実行した場合、私は思う:追加の述語を作成

  • はスペース
  • で検索文字列が
  • 、同じブースト値と各分割のための述語を作成して分割完全な検索文字列と ブースト値がより高いもの
  • は、すべての述語を1つの "OR"述語で結合します。

はまた、私はあなたが次のことをチェックすることをお勧めします:

Sitecore Solr Search Score Value

http://sitecoreinfo.blogspot.com/2015/10/sitecore-solr-search-result-items.html

+0

これは期待どおりに動作しません。私は完全な検索文字列で追加の述語を作成し、ブースト値を30(30倍)に設定しました。 「指針原則」というフレーズを検索すると、最も高いスコアは、「セット」、「設定」、さらには「マサチューセッツ」という言葉のインスタンスが多い項目です。全体のフレーズを含む項目のランクが低くなります。私は上記のように、私の述語に.Contains()を使用しています。 – betitall

関連する問題