我已将Solr与My eComemrce Web应用程序集成。我正在将产品标题和Product的许多其他领域索引到Solr。现在我已将BLÅBÆRSOMMEREN编入产品标题/名称。我已经为Title字段添加了EdgeNGram。因为EdgeNGram,如果我搜索任何令牌,我得到了结果。并且由于拼写检查,如果我搜索错误的拼写如:BLÅBÆRISOMMEREN,我得到了结果。但如果我搜索BLÅBÆRI,我没有得到任何结果,因为没有相同的令牌。
我希望结果中的产品具有BLÅBÆR,因为该令牌存在。对于任何其他错误的拼写搜索也是如此。
我怎样才能做到这一点?任何帮助将不胜感激!
感谢。
答案 0 :(得分:2)
听起来您可能会为索引和查询配置不同的Solr标记化。
因此,在您的示例中,索引中可能会出现以下术语:
但是,由于您的查询字词未被处理为ngrams,因此您只是搜索
不会出现在您的索引条款中。
这是使用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),并且通常比传统查询响应更快。