0

我正在使用 SOLR 搜索引擎。

几天前,我提出了在给定列上执行类似操作的要求。

例如:

Column name: Name

Content: Stackoverflow is good.

查询是

Name:("*overflow is*")

这个查询应该给我特定 的“Stackoverflow 很好”。因此

该输入参数应被视为一个整体输入。它不应被视为自由文本搜索。它应该像 SQL 中的“like”操作一样工作。

为此我使用此配置。

<fieldtype class="solr.TextField" name="string_wildcards" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StandardFilterFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.TrimFilterFactory" />
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StandardFilterFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.TrimFilterFactory" />
        <filter class="solr.KeywordTokenizerFactory"/>
      </analyzer>
    </fieldtype>

这个查询没有给我“like”操作所期望的结果。

例如:名称:(“溢出是”)

将搜索为免费文本,而不是像“喜欢”运算符。

它给了我结果

  1. 什么是溢出。
  2. 我的名字是ABC
  3. 什么是溢出
  4. 堆栈溢出很好。

我的预期结果只有第 4 点,上面的配置给了我所有 4 个结果,这是错误的。

请根据我的要求帮助我正确配置。

4

2 回答 2

1

关键是,您使用 StandardTokenizerFactory 拆分/标记您的输入。在这种情况下,您搜索*overflowand is*

但是:左边的通配符,比如

*溢出

solr 默认不支持。在这种情况下,您必须索引字段(列)“名称”两次。

这意味着:从 string_wildcards 类型添加一个文件名,因为您编写了一个添加第二个字段 - 让我们eman从 left_wildcards_string 类型调用它(反转:名称)。在此字段类型定义中,您添加solr.ReversedWildcardFilterFactory

最后,您的搜索范围涵盖了这两个领域。

于 2012-07-17T13:03:38.267 回答
0

关键字之间的默认布尔参数是 OR,这就是您获得所有 4 个结果的原因。

于 2013-07-14T12:11:43.053 回答