5

Solr 3.6 を e コマース サイトに統合する作業を進めています。データのインデックスが作成され、検索のパフォーマンスは非常に良好です。

Predictive Search / Auto Complete Search Suggestion の使用方法がわかりにくい場合があります。また、この機能を実装するためのベスト プラクティスについても学びたいと考えています。

私たちの目標は、 http://www.amazon.com/に似た予測検索を提供することですが、Solr でそれを実装する方法がわかりません。より具体的には、Solr からこれらの用語を構築する方法を理解したいですか、それとも solr の外部にある何かによって管理されていますか? この種の提案を提供するために辞書をどのように構築する必要がありますか? さらに、一部のフィールドでは、検索はカテゴリで検索するように提供する必要があります。Amazon の検索ボックスに「xper」と入力してみてください。xperia、xperia s、xperia p の他に、カテゴリである携帯電話とアクセサリにも xperia s がリストされていることがわかります。

ユーザー辞書を使用すると、これを管理するのは困難です。あるいは、それを正しく行う方法がわからないのかもしれません。この種の示唆的な検索を実現するために solr を最大限に活用する方法をご案内します。

4

3 に答える 3

8

いくつかのブログ投稿をお勧めします。

  • これは、うまく機能するが、いくつかの追加作業を行う必要があり、その特定の目的のために特定のルセンインデックス(solrコア)を使用する、本当に素晴らしい完全なソリューションを示しています
于 2012-08-31T12:51:14.790 に答える
1

facet.prefix は大きなインデックスには重すぎて、他のものはドキュメントがほとんどないか不明確であるため (私は愚かなプログラマーです)、ハイライト アプローチを使用しました。

aaa bbb cccでは、ユーザーが「 」と入力したとしましょう。

オートコンプリート関数 (java/javascript) は、次のパラメーターを使用して solr を呼び出します。

q="aaa bbb"~100 ...base query, all the typed words except the last
fq=ccc* ...suggest word filter using last typed word
hl=true
hl.q=ccc* ...highlight word will be the one to suggest
fl=NONE ...return empty docs in result tag
hl.pre=### ...escape chars to locate highlight word in the response
hl.post=### ...see above

rows' ' および ' hl.fragsize' パラメータを使用して提案の数を制御することもできます

aaa bbb各ドキュメントのハイライト ワードは、" " 文字列の候補の正しい候補になります。

より多くの提案語はハイライト語の前後のものであり、もちろん、有効な語を抽出し、重複を避け、提案を制限するために、より多くのフィルタを実装できます

興味があれば、いくつかの例を送ることができます...

EDITED:アプローチに関するいくつかの詳細

私が提供する例の部分は、jquery によって提供される「オートコンプリート」メカニズムを想定しています。Web アプリケーション内で jsp (またはサーブレット) を呼び出し、ユーザーが入力した単語を要求パラメーター「q」として渡します。

これはjspのコードです

ByteArrayInputStream is=null; // Used to manage Solr response
try{

  StringBuffer queryUrl=new StringBuffer('putHereTheUrlOfSolrServer');
  queryUrl.append("/select?wt=xml");
  String typedWords=request.getParameter("q");
  String base="";
  if(typedWords.indexOf(" ")<=0) {
    // No space typed by user: the 'easy case'
    queryUrl.append("&q=text:");
    queryUrl.append(URLEncoder.encode(typedWords+"*", "UTF-8"));
    queryUrl.append("&hl.q=text:"+URLEncoder.encode(typedWords+"*", "UTF-8"));
   } else {
    // Space chars present
    // we split the search in base phrase and last typed word
    base=typedWords.substring(0,typedWords.lastIndexOf(" "));
    queryUrl.append("&q=text:");
    if(base.indexOf(" ")>0)
        queryUrl.append("\""+URLEncoder.encode(base, "UTF-8")+"\"~1000");
    else
        queryUrl.append(URLEncoder.encode(base, "UTF-8"));

    typedWords=typedWords.substring(typedWords.lastIndexOf(" ")+1);
    queryUrl.append("&fq=text:"+URLEncoder.encode(typedWords+"*", "UTF-8"));
    queryUrl.append("&hl.q=text:"+URLEncoder.encode(typedWords+"*", "UTF-8"));
}

  // The additional parameters to control the solr response
  queryUrl.append("&rows="+suggestPageSize); // Number of results returned, a parameter to control the number of suggestions
  queryUrl.append("&fl=A_FIELD_NAME_THAT_DOES_NOT_EXIST"); // Interested only in highlights section, Solr return a 'light' answer
  queryUrl.append("&start=0"); // Use only first page of results
  queryUrl.append("&hl=true"); // Enable highlights feature
  queryUrl.append("&hl.simple.pre=***"); // Use *** as 'highlight border'
  queryUrl.append("&hl.simple.post=***"); // Use *** as 'highlight border'
  queryUrl.append("&hl.fragsize="+suggestFragSize); // Another parameter to control the number of suggestions
  queryUrl.append("&hl.fl=content,title"); // Look for result only in some fields
  queryUrl.append("&facet=false"); // Disable facets

  /* Omitted section: use a new URL(queryUrl.toString()) to get the solr response inside a byte array */

  is=new ByteArrayInputStream(solrResponseByteArray);

  DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
  DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
  Document doc = dBuilder.parse(is);
  XPathFactory xPathfactory = XPathFactory.newInstance();
  XPath xpath = xPathfactory.newXPath();
  XPathExpression expr = xpath.compile("//response/lst[@name=\"highlighting\"]/lst/arr[@name=\"content\"]/str");
  NodeList valueList = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);

  Vector<String> suggestions=new Vector<String>();
  for (int j = 0; j < valueList.getLength(); ++j) {
     Element value = (Element) valueList.item(j);
     String[] result=value.getTextContent().split("\\*\\*\\*");
     for(int k=0;k<result.length;k++){
        String suggestedWord=result[k].toLowerCase();
        if((k%2)!=0){
             //Highlighted words management
             if(suggestedWord.length()>=suggestedWord.length() && !suggestions.contains(suggestedWord))
                 suggestions.add(suggestedWord);
        }else{
            /* Words before/after highlighted words
               we can put these words inside another vector
               and use them if not enough suggestions */
        }
     }
  }

  /* Finally we build a Json Answer to be managed by our jquery function */
  out.print(request.getParameter("json.wrf")+"({ \"suggestions\" : [");
  boolean firstSugg=true;       
  for(String suggestionW:suggestions) {
    out.print((firstSugg?" ":" ,"));
    out.print("{ \"suggest\" : \"");
    if(base.length()>0) {
        out.print(base);
        out.print(" ");
    }
    out.print(suggestionW+"\" }");
    firstSugg=false;
  }
  out.print(" ]})");
}catch (Exception x) {
  System.err.println("Exception during main process: " + x);
  x.printStackTrace();
}finally{
  //Gracefully close streams//
  try{is.close();}catch(Exception x){;}
}

お役に立てば幸いです、ニック

于 2015-10-28T18:36:12.823 に答える
0

これはあなたを助けるかもしれません.私は同じことをしようとしています.

http://solr.pl/en/2010/10/18/solr-and-autocomplete-part-1/

于 2014-10-30T12:16:26.093 に答える