【问题标题】:How to search a phrase如何搜索短语
【发布时间】:2013-02-07 13:38:08
【问题描述】:

我做了一项工作来获取所有包含“Good”或“Microwave”或“Good Microwave”的文档,如果我将“Good Microwave”作为 q 参数传递,请指导我无论我是否朝着正确的方向前进.

我在我的架构中定义了两个字段类型(text_general 和 shingleString),如下所示

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />        
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />        
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>

<fieldType name="shingleString" class="solr.TextField" positionIncrementGap="100" omitNorms="true">
  <analyzer type="index">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.PositionFilterFactory" />
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.ShingleFilterFactory" outputUnigrams="true" outputUnigramIfNoNgram="true" maxShingleSize="99"/>
    <filter class="solr.PositionFilterFactory" />
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

然后在索引时,我将所有这些字段添加到两个不同的复制字段,如下所示。

<field name="SearchableField" type="shingleString" indexed="true" stored="false" multiValued="true"/>
    <copyField source="ProductName" dest="SearchableField"/>
     <copyField source="ProductDesription" dest="SearchableField"/>
    <copyField source="Product Feedback" dest="SearchableField"/>

<field name="SearchableField1" type="text_general" indexed="true" stored="false" multiValued="true"/>
    <copyField source="ProductName" dest="SearchableField1"/>
     <copyField source="ProductDesription" dest="SearchableField1"/>
    <copyField source="Product Feedback" dest="SearchableField1"/>

现在,如果我同时查询 SearchableField 和 SearchableField1 这两个字段,我将获得所有包含“Good”或“Microwave”或“Good Microwave”的文档。 下面是我用来获取所有文档的查询。 q=SearchableField%3AGood+Microwave%0ASearchableField1%3AGood+Microwave

但是包含整个短语“Good Microwave”的文档得分很低。 如果我的方法完全正确,任何人都可以指导我在那些包含整个短语的文档上获得更高的分数吗?

或者有人可以指导我实现这一目标吗?

【问题讨论】:

    标签: solr solrnet


    【解决方案1】:

    您好,您可以使用带有字段类型 shingleString 的“建议组件”请求处理程序使用简单查询来搜索短语。您必须专注于您的查询语法......

     http://localhost:8983/solr/suggest?wt=xml&indent=true&spellcheck=true&spellcheck.q=usrsearchphrase
    
    
     <fieldType name="shingleString" class="solr.TextField" positionIncrementGap="100" omitNorms="true">
      <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.PositionFilterFactory" />
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.ShingleFilterFactory" outputUnigrams="true" outputUnigramIfNoNgram="true" maxShingleSize="99"/>
        <filter class="solr.PositionFilterFactory" />
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>
    

    【讨论】:

    • 您好,我做了一个解决方法。我已经编辑了问题。请告诉我这是正确的方法吗?
    【解决方案2】:

    如果您有“text_general”类型的字段, 搜索:q=好微波炉 将找到其中包含“好”或“微波”的任何文档。 正在搜索:q="好微波炉" 将找到同时包含这两个术语的任何文档。 q="good微波"^5 好的微波将查找包含任一术语的任何文档,但会提升包含彼此相邻的术语的文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 2012-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多