簡體   English   中英

Solr短語搜索需要匹配部分單詞

[英]Solr phrase search needs to match on partial word

使用Solr來搜索英語和韓語文檔,到目前為止,韓語搜索工作正常。 也需要擴展英語精確短語以與部分單詞匹配。

我使用的Solr查詢:

content: "He go"

與他去,他去,他的目標等不匹配

我嘗試過這些但沒有用

content: "He go"*
content: "He go*"

當前字段架構

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.CJKBigramFilterFactory" han="false" hiragana="false" katakana="false" hangul="true" outputUnigrams="true" />
    </analyzer>
</fieldType>

因此,我的輸入和預期輸出如下:

輸入:他去(帶引號)
輸出:他走了,他走了,他的目標(應與具有這些詞的文檔匹配,可以是部分匹配)

我如何實現此功能,任何建議都將受到高度贊賞。

如果<tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="10"/>單詞的一部分進行搜索,則需要應用,例如N-Gram Tokenizer, <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="10"/>

例如。

在: "bicycle"

輸出: "bicy", "bicyc", "icyc", "icycl", "cycl", "cycle", "ycle"

在這種情況下,您將可以按詞的一部分進行搜索。 您需要為兩個分析器都應用NGramTokenizerFactory:

<fieldType name="custome_field_type" class="solr.TextField" positionIncrementGap="100" multiValued="false">
    <analyzer type="index">
      <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="10"/>
      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
      <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="10"/>
      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
      <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
  </fieldType>

如果您使用上述字段類型,則在管理工具上進行的分析如下。

Solr管理工具分析

您也可以嘗試以下查詢分析器。 這完全取決於您的要求。

<analyzer type="query">
  <tokenizer class="solr.KeywordTokenizerFactory"/>
</analyzer>

您可以在schema.xml修改或添加字段類型,並將其應用於您的字段。 完成重啟服務器后,重新索引數據。 如果數據使用solr admin工具匹配,則可以驗證字段的上述fieldType。

我使用了以下字段類型,並使用solr工具進行了分析。

這是字段類型:

    <fieldType name="custome_field_type" class="solr.TextField" positionIncrementGap="100" multiValued="false">
        <analyzer type="index">
          <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="10"/>
          <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
          <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
        <analyzer type="query">
          <tokenizer class="solr.KeywordTokenizerFactory"/>
          <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
   </fieldType>

請從solr管理工具中找到相同的分析。

Solr分析頁面

復雜短語查詢分析器支持短語中的內聯通配符。 在您的情況下,將inOrder=true附加到參數將為您提供所需的行為。

您應該注意一些限制:

性能對與模式關聯的唯一術語的數量敏感。 例如,搜索“ a *”將為索引字段中以單字母“ a”開頭的所有術語形成一個大的OR子句(從技術上講,它是一個包含許多術語的SpanOr)。 最好將通配符限制為至少兩個或三個字母作為前綴。 允許使用非常短的前綴可能會導致返回許多低質量的文檔。

請注意,它還支持前導通配符“ * a”以及隨之而來的性能問題。 在索引時間分析中應用ReversedWildcardFilterFactory通常是一個好主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM