我想在网络应用程序中使用solr创建一个自动提示的索引。
用户应该能够在网上商店中搜索产品。
当进行搜索时,我希望建议一次只能被一个词预先出现。
所以如果我写“Pe”而不是“Peak Performance”,那么建议使用相同的起始frace。
如果我继续写作例如“Sh”而不是建议将是“Peak Performance Shirt”
如果我继续写“Peak Performance Shirt B”,建议使用“Peak Performance Shirt Blue”等等。
我尝试过这样做的目的是创建这样的文档:
<entity name="p" query="SELECT * FROM Products">
<field column="ProductName" name="user_query"/>
<field column="Mark" name="mark"/>
</entity>
当Solr找到匹配项时,会发出整个文档。
有没有办法不预先提出整个文件,一次只提一个字?
答案 0 :(得分:0)
您正在做的不是自动提示,但您每次都在进行实际搜索,这就是您从搜索结果中获得结果的原因。
必须针对包含您要建议的所有可能的wird的其他字段运行自动完成。
构建一个名为“建议”的字段,其中包含例如条款: 峰 峰值性能 高峰表演衬衫 Peak Performance Shirt Blue
(这可以通过多种方式实现,并使用不同的过滤器)
现在针对“建议”字段运行自动完成功能。你会得到你期望的结果。
然后只需获取结果并使用它在Products字段上运行实际搜索。
答案 1 :(得分:0)
您可能会发现为自动完成创建不同的RequestHandler会很有帮助,即使它是从同一索引中提取的。通过这种方式,您可以定义查询哪些字段以及返回的内容 - 这样自动完成结果将不会像搜索结果那样,并且希望它会更快一些。
要匹配部分字词,您可能希望在字段类型上使用EdgeNGramFilterFactory填充字段,如下所示:
<fieldType name="startswith" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>