【问题标题】:Search in Solr with also hashtag included在包含标签的 Solr 中搜索
【发布时间】:2016-04-28 17:10:17
【问题描述】:

假设如果我在 solr 中使用关键字 IPL 进行搜索,我想要同时包含 IPL 和 #IPL 的结果。如何做到这一点?

我在索引和查询中尝试了下面这样的 WordDelimFactory,但没有成功 .

我想我必须将字符串拆分为“string”和“#string”,但不知道该怎么做。

【问题讨论】:

    标签: solr lucene tokenize solr4 stemming


    【解决方案1】:

    如果您希望每个关键字都作为#keyword 进行搜索,那么您可以尝试在查询中使用 OR 运算符,例如

    /select?q="IPL" OR "#IPL"
    

    如果你想在特定领域进行搜索,那么

    /select?q=title:"IPL" OR title:"#IPL"
    

    您可以尝试使用同义词。但在这种情况下,它只是前缀#。

    转到您的 solr 实例的配置文件。在 conf 文件夹中编辑 synonyms.txt 文件。

    IPL => #IPL

    在 schema.xml 文件中更改您的查询字段标记器,

    <fieldType name="text" class="solr.TextField" positionIncrementGap="100">  
          <analyzer type="query">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
            <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
            <filter class="solr.LowerCaseFilterFactory"/>
     </analyzer>
    </fieldType>
    

    然后用字段名/select?q=text:#IPL查询

    因为 solr 文本是默认的,你可以试试/select?q=#IPL

    【讨论】:

    • 我想对所有搜索关键字执行此操作,而不仅仅是 IPL。如何在 synonyms.txt 中这样配置?
    • 您的查询词已标记化。 solr.StandardTokenizerFactory 将从您的关键字中删除 #。
    • 我正在使用 whitespacefactory
    • 我修改了答案检查它。在 schema.xml 文件中更改查询字段标记器
    【解决方案2】:

    这是通过WordDelimiterFilterFactory 完成的。设置generateWordParts=1. 同时保持preserveOriginal=1。 这将保留原始文件,并在没有 # 的情况下创建新文件。

    修改schema.xml后重启服务器并重新索引数据。

    <fieldType name="text" class="solr.TextField" positionIncrementGap="100">
    <analyzer>
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    
            <filter class="solr.StopFilterFactory"
                    ignoreCase="true"
                    words="stopwords.txt"
                    enablePositionIncrements="true"
                    />
            <filter class="solr.WordDelimiterFilterFactory"
                    protected="protwords.txt"
                    generateWordParts="1"
                    generateNumberParts="1"
                    catenateWords="1"
                    catenateNumbers="1"
                    catenateAll="0"
                    splitOnCaseChange="0"
                    preserveOriginal="1"/>
            <filter class="solr.LengthFilterFactory" min="2" max="100" />
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
            <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
    
          </analyzer>
        </fieldType>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-02
      • 2012-07-23
      相关资源
      最近更新 更多