Trying to implement scoped autosuggestions with solr

前提是你 提交于 2019-12-24 00:48:41

问题


I am trying to implement scoped autosuggestions like in ecommerce websites like amazon etc.

eg. if i type Lego , the suggestions should come like

  • Legolas in Names

  • Lego in Toys

where Names and Toys are solr field names.

closest aid i got is from this discussion: solr autocomplete with scope is it possible?

Which informed me that it isn't possible with the suggester which I am currently using.

Until now, using the suggester I am able to achieve autosuggestions from a single solr field. [the autosuggest field , following guidelines in the suggester documentation]

Any ideas/links to help me with ?

Update

I tried to achieve autosuggestions using facets. My query looks something like:

http://localhost:8983/solr/core1/select?q=*%3A*&rows=0&wt=json&indent=true&facet=true&facet.field=field1&facet.field=field2&facet.prefix=i

This gives me all the facet results starting with letter 'i' and term faceted to field1 and field2.

This gave me the idea.

Any comments?


回答1:


I am assuming you are storing the Names or Toys data as in a field, let call it category.

You can configure the payloadField parameter in the searchComponent definition and pass the category data into it. Later in the application when you receive the suggestion results from solr, show first suggestion from each category or which ever strategy suits better for your use case.

You can find the more information in Solr Suggester.




回答2:


  1. Suggester component seems useful but in payload field, one can only return a single field which may not satisfy many of the use cases.

  2. By Facet prefixing, you cannot get suggestions from a word in the middle. So "Lego" will give suggestion of a product whose value in name field is "Legolas Sample" but not from "Sample Legolas".

  3. The third way is to implement autosuggest is by using a index analyzer that has a layer of EdgeNGramFilterFactory and then searching on the required prefix.

So, the solr schema will look like

<field name="names" type="string" multiValued="false" indexed="true" stored="true"/>
<field name="toys" type="string" multiValued="false" indexed="true" stored="true"/>
<field name="names_ngram" type="text_suggest_ngram" multiValued="false" indexed="true" stored="false"/>
<field name="toys_ngram" type="text_suggest_ngram" multiValued="false" indexed="true" stored="false"/>

and the field type would have a definition of

<fieldType name="text_suggest_ngram" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.LowerCaseFilterFactory"/>
  <filter class="solr.EdgeNGramFilterFactory" maxGramSize="10" minGramSize="2"/>
</analyzer>
<analyzer type="query">
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.LowerCaseFilterFactory"/>
</analyzer>

and these _ngram fields would be a copyfield:

<copyField source="names" dest="names_ngram"/>
<copyField source="toys" dest="toys_ngram"/>

So , once you have reindexed your data, if you query for "Lego" it will give results from both "Sample Legolas" and "Legolas Sample". However, if you have to categorize these results according to n fields they matched, that would be n different queries which is usually not a problem.




回答3:


You can add multiple suggester components. Add one for each field.

E.g. :

<searchComponent name="suggest" class="solr.SuggestComponent">
  <lst name="suggester">
    <str name="name">namesSuggester</str>
    <str name="lookupImpl">BlendedInfixLookupFactory</str>
    <str name="dictionaryImpl">DocumentDictionaryFactory</str>
    <str name="field">Names</str>
    <str name="weightField">Popularity</str>
    <str name="indexPath">namesSuggesterIndexDir</str>
    <str name="suggestAnalyzerFieldType">suggester</str>
  </lst>
  <lst name="suggester">
    <str name="name">toysSuggester</str>
    <str name="lookupImpl">BlendedInfixLookupFactory</str>
    <str name="dictionaryImpl">DocumentDictionaryFactory</str>
    <str name="field">Toys</str>
    <str name="weightField">Popularity</str>
    <str name="indexPath">toysSuggesterIndexDir</str>
    <str name="suggestAnalyzerFieldType">suggester</str>
  </lst>
</searchComponent>


来源:https://stackoverflow.com/questions/33501053/trying-to-implement-scoped-autosuggestions-with-solr

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!