按短语的一部分搜索最常见的短语

时间:2015-01-29 14:40:20

标签: solr elasticsearch search-engine sphinx

我没有琐碎的任务,想要了解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"/>

1 个答案:

答案 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,如果您不关心文档而只需要方面。)