Solr用错误的法术搜索

时间:2016-01-30 11:34:27

标签: solr websolr

我已将Solr与My eComemrce Web应用程序集成。我正在将产品标题和Product的许多其他领域索引到Solr。现在我已将BLÅBÆRSOMMEREN编入产品标题/名称。我已经为Title字段添加了EdgeNGram。因为EdgeNGram,如果我搜索任何令牌,我得到了结果。并且由于拼写检查,如果我搜索错误的拼写如:BLÅBÆRISOMMEREN,我得到了结果。但如果我搜索BLÅBÆRI,我没有得到任何结果,因为没有相同的令牌。

我希望结果中的产品具有BLÅBÆR,因为该令牌存在。对于任何其他错误的拼写搜索也是如此。

我怎样才能做到这一点?任何帮助将不胜感激!

感谢。

2 个答案:

答案 0 :(得分:2)

听起来您可能会为索引和查询配置不同的Solr标记化。

因此,在您的示例中,索引中可能会出现以下术语:

  • BL
  • BLA
  • BLAB
  • BLÅBÆ
  • BLÅBÆR
  • BLÅBÆRS

但是,由于您的查询字词未被处理为ngrams,因此您只是搜索

  • BLÅBÆRI

不会出现在您的索引条款中。

这是使用ngrams时的常见做法,但是在您的用例中,您希望在结果中返回部分匹配。

检查您的Solr架构,以确保为查询时配置了匹配的EdgeNGram过滤器,就像索引时一样,例如。

<fieldType name="text_general_edge_ngram" class="solr.TextField" positionIncrementGap="100">
   <analyzer type="index">
      <tokenizer class="solr.LowerCaseTokenizerFactory"/>
      <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
   </analyzer>
   <analyzer type="query">
      <tokenizer class="solr.LowerCaseTokenizerFactory"/>
      <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
   </analyzer>
</fieldType>

请确保您按score排序,因为此策略很可能会给您带来许多误报!

答案 1 :(得分:1)

对于拼写错误的单词,您可以使用模糊查询(允许对索引术语进行匹配,编辑距离为查询术语的约1或〜2)。

使用您的示例,BLÅBÆRISOMMEREN是您的索引术语编辑距离1(一个字符差异)。

因此,查询Courses *freeCourse(Course *course) { Course *next = course->next; free(course->courseName); // if it was allocated free(course); return next; } Student *freeStudent(Student* student) { Student *next = student->next; while (student->courseList) { student->courseList = freeCourse(student->courseList); } free(student->studentName); // if it was allocated free(student); return next; } School *freeSchool(School *school) { while (school->studentList) { school->studentList = freeStudent(school->studentList); } free(school->schoolName); // if it was allocated free(school); return NULL; } 将与您的标题词匹配,但BLÅBÆRI不会(没有上一个答案的ngram方法。)

如果您正在尝试构建自动建议,您还可以调查Solr的Suggester component,因为它还可以处理模糊的建议,如:(BLÅBÆRI - &gt;BLÅBÆRSOMMEREN),并且通常比传统查询响应更快。