我没有琐碎的任务,想要了解Sphinx或Solr是否是解决问题的正确工具。简化示例:我的网站上有搜索字段,可按产品说明进行搜索。以及mysql db中的下一个描述:
Id Desc
1 this is my test document number one. also checking search within phrases.
2 this is my test document number two
3 this is another group
4 this is first group
5 this is first test
6 this is your test
当用户在搜索字段中键入一些文本时。 "是"他应该得到下一个结果(前三个短语包含"是"): "这是","是我的","是第一个"。
有人有任何想法如何做到这一点?也许你现在有一些更适合我需求的搜索引擎?
<fieldType class="solr.TextField" name="text_auto">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ShingleFilterFactory" maxShingleSize="4" outputUnigrams="true" outputUnigramsIfNoShingles="false" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>
<field name="title" type="text_auto" indexed="true" stored="true"/>
<field name="content_autosuggest" type="text_auto" indexed="true" stored="true" multiValued="false"/>
<copyField source="title" dest="content_autosuggest"/>
答案 0 :(得分:1)
您可以尝试使用ShingleFilter。如wiki上的示例所示,如果将maxShingleSize和mixShingleSize都设置为2,则可以得到:
this is my test document => this is, is my, my test, test document
(如果需要,请确保在木瓦过滤器之前使用适当的标记器和其他分析器。)
然后你可以在这个字段上进行这样的正则表达式搜索:
shingle_field:/(is .*)|(.* is)/
应返回所有文件。 (我相信这应该有效,因为维基说:它创建了令牌组合作为单个令牌。)
使用facet query获取计数:
shingle_field:/(is .*)|(.* is)/&facet=true&facet.field=shingle_field
(添加rows=0
,如果您不关心文档而只需要方面。)