如何使用短语作为termfreq术语参数

时间:2015-01-09 17:52:57

标签: solr lucene

我想使用termfreq来提供匹配字段中短语的频率。在浏览了很多帖子的基础上,我已经为目标字段设置了相关的fieldType,如下所示:

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<!-- in this example, we will only use synonyms at query time
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
    -->
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.SnowballPorterFilterFactory"/>
    <filter class="solr.ShingleFilterFactory" maxShingleSize="4" outputUnigramsIfNoShingles="true"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.SnowballPorterFilterFactory"/>
    <filter class="solr.ShingleFilterFactory" maxShingleSize="4" outputUnigramsIfNoShingles="true"/>
  </analyzer>
</fieldType>

该字段是:

<field name="text" type="text_general" indexed="true" stored="false" multiValued="true" omitTermFreqAndPositions="false" termVectors="true" termPositions="true" termOffsets="true"/>

作为测试,我有一个文本字段,其中包含短语&#34; test document&#34;。给定此设置,函数termfreq(text,&#34; test document&#34;)正确返回1.但是,如果我改为调用termfreq(text,&#34; document test&#34;),它将返回0,甚至虽然当我使用文本查询:&#34;文档测试&#34;时,它报告文档的命中(这是我想要的)。

所以我对这应该如何运作感到困惑。我还希望将邻近运算符作为termfreq术语的一部分(类似于termfreq(文本,&#34;测试文档&#34; ~4)),但我无论如何也无法找到它。

1 个答案:

答案 0 :(得分:0)

运行查询时,传入的字符串是查询。在调用termfreq函数时,您将传递一个 term 而不是查询。

解析查询的查询语法,并进行分析(通常)。一个学期都不会发生。术语本质上是索引文本的原子单元,因此它将查找精确您在索引中传入的术语。

因此,对于您的查询text:"document test",您将搜索三个词document testdocumenttest。虽然在索引中找不到document test,但其他两个是,所以你有匹配。对于termfreq调用,您特别要求它获取单个术语document test的频率,即0。