2012-08-31 7 views
3

Nous travaillons sur l'intégration de Solr 3.6 à un site de commerce électronique. Nous avons indexé des données & recherche est très performant.Configuration de Solr pour la recherche automatique complète prédictive/prédictive

Nous avons quelques difficultés à comprendre comment utiliser la recherche prédictive/la recherche automatique complète. Également intéressé d'apprendre les meilleures pratiques pour la mise en œuvre de cette fonctionnalité.

Notre but est d'offrir une recherche prédictive semblable à http://www.amazon.com/, mais nous ne savons pas comment l'implémenter avec Solr. Plus précisément, je veux comprendre comment construire ces termes à partir de Solr, ou est-ce géré par quelque chose d'extérieur à Solr? Comment le dictionnaire devrait-il être construit pour offrir ce genre de suggestions? De plus, pour certains champs, la recherche devrait offrir de rechercher dans la catégorie. Essayez de taper "xper" dans la boîte de recherche Amazon, et vous remarquerez que, en dehors de xperia, xperia s, xperia p, il liste également xperia s dans les accessoires de téléphones cellulaires &, qui est une catégorie. En utilisant un dictionnaire personnel, cela serait difficile à gérer. Ou peut-être que nous ne savons pas comment le faire correctement. Vous cherchez à nous guider sur la meilleure façon d'utiliser solr pour réaliser ce genre de recherche suggestive.

+0

Puis-je savoir si ma réponse a été utile? – javanna

+0

Non, cela m'aide à comprendre ce qui peut être fait ... mais je n'ai pas eu une idée précise de ce qui devrait être fait, et plus précisément comment le faire. – Krunal

Répondre

6

Je vous suggère quelques blogpost:

  • This qui je l'ai écrit, ce qui vous montre ce hors-the-box options que vous avez dans Solr et quelles sont les questions que vous devez répondre afin de choisir l'un d'entre eux
  • This celui qui vous montre une solution complète vraiment sympa, ce qui fonctionne bien, mais nécessite des travaux supplémentaires à effectuer, et utilise un indice de Lucene spécifique (noyau solr) à cette fin spécifique
+0

Pouvez-vous m'aider à comprendre cela pour Solr, pour un problème similaire lié à Suggester? http://stackoverflow.com/questions/12453600/solr-suggester-lookup-class-for-predictive-search –

1

I utilisé l'approche Highlight parce que le facet.prefix un est trop lourd pour gros index, et les autres avaient peu ou pas claire la documentation (je suis un programmeur stupide)

Alors nous allons supposons que l'utilisateur a tapé juste "aaa bbb ccc"

Notre fonction autocomplete (java/javascript) appellera solr en utilisant les paramètres suivants

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 

vous pouvez également contrôler le nombre de suggestion avec « rows » et « hl.fragsize » paramètres

les mots en surbrillance dans chaque document seront les bons candidats pour la suggestion avec « aaa bbb » string

plusieurs mots de suggestion sont ceux avant/après les mots de surbrillance et, bien sûr, vous pouvez implémenter plus de filtres pour extraire les mots valides, éviter les doublons, limiter les suggestions

si vous êtes intéressé je peux vous envoyer quelques exemples ...

ÉDITÉ: Quelques autres détails sur l'approche

La partie de l'exemple que je donne suppose le mécanisme « autocomplete » donnée par jquery: nous invoquons une jsp (ou un servlet) à l'intérieur d'une application web qui passe comme demande param 'q' les mots juste tapés par l'utilisateur.

C'est le code du 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){;} 
} 

espoir d'être serviable, Nik

+0

Salut, C'est une approche complètement différente. Oui, veuillez partager les exemples, cela sera très utile. Je vous remercie!! – Krunal

Questions connexes