0

我做了一项工作以获取所有包含“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”的文档得分很低。如果我的方法完全正确,任何人都可以指导我在那些包含整个短语的文件上获得更高的分数吗?

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

4

2 回答 2

0

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

于 2013-02-12T19:53:50.663 回答
0

您好,您可以使用带有字段类型 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>
于 2013-02-07T16:08:10.120 回答