带破折号的 Solr 查询
Solr Queries With Dashes
我目前正在使用 solr edismax 在我们的网站上进行搜索。我想要做的,基本上是忽略破折号。
因此,如果我搜索这些词,"wi-fi adapter"
。我有一个文件,标题为 "wifi adapter"。我不会得到任何结果。
我目前正在使用 solr.MappingCharFilterFactory
将破折号映射到 space。这就是我的 text_general
字段类型在我的架构中的样子。
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<tokenizer class="solr.ClassicTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping.txt"/>
<filter class="solr.LowerCaseFilterFactory"/>
<charFilter class="solr.HTMLStripCharFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.ClassicTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping.txt"/>
<filter class="solr.SynonymGraphFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
<filter class="solr.LowerCaseFilterFactory"/>
<charFilter class="solr.HTMLStripCharFilterFactory"/>
</analyzer>
</fieldType>
我的 mapping.txt 包含行..
"-" => " "
这条规则的作用是将破折号转换为 space。
因此,如果我搜索 "wi fi adapter",它将始终显示与 "wi fi adapter"
相同的结果,但不会显示 "wifi adapter"
.
的结果
有什么办法可以像这样处理破折号吗?基本上我想对待 "wifi adapter", "wi-fi adapter", and "wi fi adapter"
一样。
您可以将 WordDelimiterGraphFilterFactory
用于您的分析器。它有很多可以使用的属性。我列举了几个。
WordDelimiterGraphFilterFactory
有很多属性。
generateWordParts
:(整数,默认为 1)如果非零,则在分隔符处拆分单词。例如:"CamelCase", "hot-spot" → "Camel", "Case", "hot", "spot"
preserveOriginal
:(整数,默认为 0)如果非零,则保留原始标记:"Zap-Master-9000" → "Zap-Master-9000", "Zap", "Master", "9000"
catenateWords
:(整数,默认为 0)如果非零,将加入单词部分的最大运行:"hot-spot-sensor’s" → "hotspotsensor"
所以在你的情况下它会像
<fieldType name="text_wd" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<!-- Splits words based on whitespace characters -->
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<!-- splits words at delimiters based on different arguments -->
<filter class="solr.WordDelimiterGraphFilterFactory" preserveOriginal="1" catenateWords="1"/>
<!-- Transforms text to lower case -->
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
有关它的更多信息,请访问 Fiters available in solr
我目前正在使用 solr edismax 在我们的网站上进行搜索。我想要做的,基本上是忽略破折号。
因此,如果我搜索这些词,"wi-fi adapter"
。我有一个文件,标题为 "wifi adapter"。我不会得到任何结果。
我目前正在使用 solr.MappingCharFilterFactory
将破折号映射到 space。这就是我的 text_general
字段类型在我的架构中的样子。
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<tokenizer class="solr.ClassicTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping.txt"/>
<filter class="solr.LowerCaseFilterFactory"/>
<charFilter class="solr.HTMLStripCharFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.ClassicTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping.txt"/>
<filter class="solr.SynonymGraphFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
<filter class="solr.LowerCaseFilterFactory"/>
<charFilter class="solr.HTMLStripCharFilterFactory"/>
</analyzer>
</fieldType>
我的 mapping.txt 包含行..
"-" => " "
这条规则的作用是将破折号转换为 space。
因此,如果我搜索 "wi fi adapter",它将始终显示与 "wi fi adapter"
相同的结果,但不会显示 "wifi adapter"
.
有什么办法可以像这样处理破折号吗?基本上我想对待 "wifi adapter", "wi-fi adapter", and "wi fi adapter"
一样。
您可以将 WordDelimiterGraphFilterFactory
用于您的分析器。它有很多可以使用的属性。我列举了几个。
WordDelimiterGraphFilterFactory
有很多属性。
generateWordParts
:(整数,默认为 1)如果非零,则在分隔符处拆分单词。例如:"CamelCase", "hot-spot" → "Camel", "Case", "hot", "spot"
preserveOriginal
:(整数,默认为 0)如果非零,则保留原始标记:"Zap-Master-9000" → "Zap-Master-9000", "Zap", "Master", "9000"
catenateWords
:(整数,默认为 0)如果非零,将加入单词部分的最大运行:"hot-spot-sensor’s" → "hotspotsensor"
所以在你的情况下它会像
<fieldType name="text_wd" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<!-- Splits words based on whitespace characters -->
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<!-- splits words at delimiters based on different arguments -->
<filter class="solr.WordDelimiterGraphFilterFactory" preserveOriginal="1" catenateWords="1"/>
<!-- Transforms text to lower case -->
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
有关它的更多信息,请访问 Fiters available in solr