2016-03-04 55 views
0

如何操作发送到Solr的查询字符串?Solr:操作查询字符串

例如,有人输入“stackoverflow-version1.0”,但没有找到结果。但是,如果查询只是“stackoverflow”,搜索将会成功。 所以我想截断“ - ”并再次搜索第一部分。

有些研究把我带到solr.PatternReplaceCharFilterFactory类。我将它包含在我的schema.xml中。有没有人看到,为什么我的查询仍然没有产生任何结果?我应该使用其他课程吗?

UPDATE: 现在我的代码看起来如下:

<fieldType name="ngram" class="solr.TextField" omitNorms="true"> 
    <analyzer type="index"> 
    <tokenizer class="solr.NGramTokenizerFactory" minGramSize="1" maxGramSize="20" /> 
    <filter class="solr.WordDelimiterFilterFactory" 
     generateWordParts="1" 
     splitOnNumerics="0" 
     generateNumberParts="0" 
     catenateWords="0" 
     catenateNumbers="0" 
     catenateAll="0" 
     preserveOriginal="1" 
    /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.ASCIIFoldingFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.WordDelimiterFilterFactory" 
     generateWordParts="1" 
     generateNumberParts="0" 
     splitOnNumerics="0" 
     catenateWords="0" 
     catenateNumbers="0" 
     catenateAll="0" 
     preserveOriginal="1" 
    /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.ASCIIFoldingFilterFactory"/> 
    </analyzer> 
</fieldType> 

运行分析它给了我这样的: enter image description here

这里查询UI:enter image description here

+0

你能否澄清,是失败的查询:'计算器 - version1.0'或'“计算器 - 1.0版”' – femtoRgon

+0

它是不带引号 – steph

回答

1

你可以试试WordDelimiterFilterFactory,它有很多选项可以尝试...

您可以尝试以下字段类型为您的字段。

<fieldtype name="subword" class="solr.TextField"> 
     <analyzer type="query"> 
      <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
      <filter class="solr.WordDelimiterFilterFactory" 
       generateWordParts="1" 
       generateNumberParts="1" 
       catenateWords="0" 
       catenateNumbers="0" 
       catenateAll="0" 
       preserveOriginal="1" 
       /> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.StopFilterFactory"/> 
     </analyzer> 
     <analyzer type="index"> 
      <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
      <filter class="solr.WordDelimiterFilterFactory" 
       generateWordParts="1" 
       generateNumberParts="1" 
       catenateWords="1" 
       catenateNumbers="1" 
       catenateAll="0" 
       preserveOriginal="1" 
       /> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.StopFilterFactory"/> 
     </analyzer> 
    </fieldtype> 

在这里,您可以一旦的FieldType添加并应用到外地玩的WordDelimiterFilterFactory

重新启动服务器,您可以分析solr分析页面中的输入和输出。在solr分析页面上,它将向您展示如何为在索引和查询时给出的输入生成标记。

这将帮助您根据您的要求构建自己的自定义字段类型。

这里是链接列出了所有的分词器和过滤器的例子。 analyzers

+0

第一个我更新了我的代码之上,但仍显示,当我输入“stackoverflow-version1.0”时,我找不到“stackoverflow” – steph

+0

您是否检查在solr管理页面中创建的令牌......在索引中创建了所有令牌以及为查询创建了所有令牌... ?你可以在这里张贴...?这将有助于指导你... –

+0

我添加了一个截图。这部分是否足够说明?因为输出实际上要大得多 – steph