在SOLR中使用类似的操作

时间:2012-07-17 06:19:23

标签: java solr

我正在使用SOLR搜索引擎。

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

例如:

Column name: Name

Content: Stackoverflow is good.

查询

Name:("*overflow is*")

这个查询应该具体给我 “Stackoverflow很好。”因此

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

对于使用此配置的iam。

<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. Stackoverflow很好。
  5. 我的预期结果仅为第4点,其中上述配置为我提供了所有4个结果,这是错误的。

    请帮我正确配置我的要求。

2 个答案:

答案 0 :(得分:1)

关键是,您使用StandardTokenizerFactory分割/标记您的输入。 在这种情况下,您需要搜索*overflowis*

但是:左侧的通配符,如

  

*溢出

默认情况下,solr不支持

。 在这种情况下,您必须将字段(列)“名称”索引两次。

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

最后,您可以搜索这两个字段。

答案 1 :(得分:0)

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