【问题标题】:Solr search multiple word in querySolr在查询中搜索多个单词
【发布时间】:2015-11-02 03:00:08
【问题描述】:

我在 solr 架构中有以下字段

make
model
city
province

我创建了一个复制字段搜索并将这 4 个字段复制到其中

现在我想要,如果用户正在搜索

'audi a4' where audi is a make and a4 is model, 

我应该得到连续 make 是 audi 和 model 是 a4 的结果。

如果我搜索

'asd audi asd' 

那么我应该只得到 audi 的结果。

如果我搜索

'asd aasd audi asd a4',

那么它应该显示 audi a4 结果。

请帮助我实现这一目标。

请参阅复制字段的架构

   <copyField source="Make" dest="search"/>
   <copyField source="Model" dest="search"/>
   <copyField source="City" dest="search"/>

创建的字段如下

<field name="search" type="string" indexed="true" stored="false" multiValued="true"/>

【问题讨论】:

  • 你使用的字段类型是什么?
  • 我使用搜索作为字符串
  • 你能分享你的架构吗?
  • 请查看编辑
  • 改成 text_general 和 index 然后尝试搜索

标签: php search solr


【解决方案1】:

您可以为您的字段尝试此 fieldType。

<fieldType name="text" class="solr.TextField">
    <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>

或者你可以试试这个字段类型作为搜索字段

<fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="1" catenateWords="0" catenateNumbers="0" preserveOriginal="1" catenateAll="0" splitOnCaseChange="0"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
      </analyzer>
      <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
      </analyzer>
    </fieldType>

所以你的领域现在是

<field name="search" type="text_ws" indexed="true" stored="false" multiValued="true"/>

【讨论】:

  • 这不起作用搜索:“audi a4”只给出“audi”的结果
  • 您是否尝试在 solr Web 界面工具中进行相同的分析?
  • 你发现了什么?可以分享它的屏幕截图......这样我就可以在我的最后尝试......
  • solr.WordDelimiterFilterFactory 过滤器将单词(标记)拆分为子单词。所以令牌“a4​​”将被分成两个令牌“a”和“4”。您在分析的查询阶段没有做同样的事情。鉴于您在帖子中的要求,我认为不需要 solr.WordDelimiterFilterFactory。 @Abhijit 建议的“文本”字段类型应该可以工作。此外,索引和查询阶段的作用相同,因此无需指定两次。只需指定一次分析器,无需任何类型。
  • @abhishekbafna : preserveOriginal="1" 将 a4 保留在索引中。但是是的,根据他的要求,哪个适合他。在文本字段中输入:是的,我同意 abhishek 不需要指定两次。
猜你喜欢
  • 1970-01-01
  • 2015-11-02
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多