在Solr索引中搜索连接词

在Solr索引中搜索连接词,solr,lucene,n-gram,text-analysis,Solr,Lucene,N Gram,Text Analysis,我正在努力解决两个类似的用例 以下是我的索引中的示例文档: { "id":"E850AC8D844010AFA76203B390DD3135", "brand_txt_en":"Tom Ford", "catch_all":["Tom Ford", "FT 5163", "Tom Ford", "FT 5163", "DARK HAVANA"], "mo

我正在努力解决两个类似的用例

以下是我的索引中的示例文档:

{
        "id":"E850AC8D844010AFA76203B390DD3135",
        "brand_txt_en":"Tom Ford",
        "catch_all":["Tom Ford",
          "FT 5163",
          "Tom Ford",
          "FT 5163",
          "DARK HAVANA"],
        "model_txt_en":"FT 5163",
        "brand_txt_en_split":"Tom Ford",
        "model_txt_en_split":"FT 5163",
        "color_txt_en":"DARK HAVANA",
        "material_s":"acetato",
        "gender_s":"uomo",
        "shape_s":"Wayfarer",
        "lens_s":"cerchiata",
        "modelkey_s":"86_1_FT 5163",
        "sales_i":0,
        "brand_s":"Tom Ford",
        "model_s":"FT 5163",
        "color_s":"DARK HAVANA",
        "_version_":1569456572504997895
}
查询:brand_txt_en_split:tomford

没有结果

字段类型是Solr的默认类型:

<fieldType name="text_en_splitting" class="solr.TextField" autoGeneratePhraseQueries="true" positionIncrementGap="100">
    <analyzer type="index">
      <tokenizer class="solr.WhitespaceTokenizerFactory"/>
      <filter class="solr.StopFilterFactory" words="lang/stopwords_en.txt" ignoreCase="true"/>
      <filter class="solr.WordDelimiterFilterFactory" catenateNumbers="1" generateNumberParts="1" splitOnCaseChange="1" generateWordParts="1" catenateAll="0" catenateWords="1"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
      <filter class="solr.PorterStemFilterFactory"/>
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.WhitespaceTokenizerFactory"/>
      <filter class="solr.SynonymFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
      <filter class="solr.StopFilterFactory" words="lang/stopwords_en.txt" ignoreCase="true"/>
      <filter class="solr.WordDelimiterFilterFactory" catenateNumbers="0" generateNumberParts="1" splitOnCaseChange="1" generateWordParts="1" catenateAll="0" catenateWords="0"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
      <filter class="solr.PorterStemFilterFactory"/>
    </analyzer>
  </fieldType>
我希望在此查询后找到该文档: 俱乐部老板

对于后一种情况,我想我应该使用EdgeNGram过滤器,但我真的不知道如何做到这一点

感谢您的帮助

WordDelimiterFilterFactory提供了catenateWords和catenateAll。它适用于以下情况:

catenateWords: (integer, default 0) If non-zero, maximal runs of word parts will be joined: "hot-spot-sensor's" -> "hotspotsensor"

catenateAll: (0/1, default 0) If non-zero, runs of word and number parts will be joined: "Zap-Master-9000" -> "ZapMaster9000"`
要删除单词之间的空格,请尝试下面的筛选器

<filter class="solr.PatternReplaceFilterFactory" pattern="(\s+)" replacement="" replace="all" />
还有另一个过滤器,您可以尝试相同的方法

<filter class="solr.NGramFilterFactory" minGramSize="4" maxGramSize="25"/>

您可以阅读更多有关分析仪和过滤器的信息

谢谢。不幸的是,这不是我问题的答案。我的意思是:我怎样才能添加一个由所有其他标记串联而成的标记呢?在您的示例中:热点传感器->热点传感器我已更新了答案。尝试使用PatternReplaceFilterFactory。添加/更新schema.xml后。重新启动服务器并重新索引数据。
<analyzer>
  <tokenizer class="solr.KeywordTokenizerFactory"/>
  <filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="25"/>
</analyzer>
"John", "John ", "John O", "John Ol", "John Oli", "John Oli", "John Oliv", "John Olive", "John Oliver", "John Oliver ", "John Oliver W", "John Oliver W "
, "John Oliver W C", "John Oliver W Cl", "John Oliver W Cla", "John Oliver W Clan", "John Oliver W Clane".
<filter class="solr.NGramFilterFactory" minGramSize="4" maxGramSize="25"/>