Synonym.txt文件中使用的特殊字符(例如 *)在Solr中不起作用



solr使用版本4.10.4搜索,我创建了file shonynym.s.txt并应用同义词filterfactory如下:

<fieldType name="text_general" class="solr.TextField">  
     <analyzer>     
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="0" splitOnCaseChange="0" splitOnNumerics="0" catenateWords="1" catenateNumbers="0" catenateAll="0" preserveOriginal="1" stemEnglishPossessive="0"/>
     </analyzer>
     <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
     </analyzer>
</fieldType>

同义词。

holland* => holland
holland, netherland, netherlands, niederlande

我在应用程序中有某些条件,这些条件生成术语为: holland*

在这种情况下,我想显示与放置术语hollandnetherlandnetherlandsniederlande的结果相同的结果。

但是目前,对于荷兰*术语,它没有给出匹配的结果。荷兰*的结果包含的结果是"荷兰"或"荷兰"的术语,但是这些结果在底部,所以我们可以提高这些结果吗?

有人有任何想法,我该如何实现?

下面有几个详细信息:

在荷兰,我会得到一些结果,当我调试查询时,它显示为

"debug": {
    "rawquerystring": "holland",
    "querystring": "holland",
    "parsedquery": "(name:holland name:netherland name:netherlands name:niederlande)/no_coord",
    "parsedquery_toString": "name:holland name:netherland name:netherlands name:niederlande",
    "explain": {
      "country-NLD-de": "n7.42217 = (MATCH) sum of:n  7.42217 = (MATCH) weight(name:niederlande in 1775593) [DefaultSimilarity], result of:n    7.42217 = score(doc=1775593,freq=1.0), product of:n      0.5213204 = queryWeight, product of:n        14.237252 = idf(docFreq=14, maxDocs=8413113)n        0.036616646 = queryNormn      14.237252 = fieldWeight in 1775593, product of:n        1.0 = tf(freq=1.0), with freq of:n          1.0 = termFreq=1.0n        14.237252 = idf(docFreq=14, maxDocs=8413113)n        1.0 = fieldNorm(doc=1775593)n",
      "country-NLD-en": "n7.3550315 = (MATCH) sum of:n  7.3550315 = (MATCH) weight(name:netherlands in 230095) [DefaultSimilarity], result of:n    7.3550315 = score(doc=230095,freq=1.0), product of:n      0.5189572 = queryWeight, product of:n        14.172713 = idf(docFreq=15, maxDocs=8413113)n        0.036616646 = queryNormn      14.172713 = fieldWeight in 230095, product of:n        1.0 = tf(freq=1.0), with freq of:n          1.0 = termFreq=1.0n        14.172713 = idf(docFreq=15, maxDocs=8413113)n        1.0 = fieldNorm(doc=230095)n",
      "place-49218-de": "n5.0385056 = (MATCH) sum of:n  5.0385056 = (MATCH) weight(name:holland in 385574) [DefaultSimilarity], result of:n    5.0385056 = score(doc=385574,freq=1.0), product of:n      0.4295267 = queryWeight, product of:n        11.730367 = idf(docFreq=183, maxDocs=8413113)n        0.036616646 = queryNormn      11.730367 = fieldWeight in 385574, product of:n        1.0 = tf(freq=1.0), with freq of:n          1.0 = termFreq=1.0n        11.730367 = idf(docFreq=183, maxDocs=8413113)n        1.0 = fieldNorm(doc=385574)n",

在荷兰*的情况下,结果包含来自荷兰的一些记录,但调试部分如下:

"debug": {
    "rawquerystring": "holland*",
    "querystring": "holland*",
    "parsedquery": "name:holland*",
    "parsedquery_toString": "name:holland*",
    "explain": {
      "place-51432-de": "n1.0 = (MATCH) ConstantScore(name:holland name:hollandarod name:hollande name:hollander name:hollanderei name:hollandia name:hollandischer name:hollands name:hollandsbjerg name:hollandsch name:hollandsche name:hollandscheveld name:hollandsdiep name:hollandskamp name:hollandske), product of:n  1.0 = boostn  1.0 = queryNormn",
      "place-49196-de": "n1.0 = (MATCH) ConstantScore(name:holland name:hollandarod name:hollande name:hollander name:hollanderei name:hollandia name:hollandischer name:hollands name:hollandsbjerg name:hollandsch name:hollandsche name:hollandscheveld name:hollandsdiep name:hollandskamp name:hollandske), product of:n  1.0 = boostn  1.0 = queryNormn",
      "place-49207-de": "n1.0 = (MATCH) ConstantScore(name:holland name:hollandarod name:hollande name:hollander name:hollanderei name:hollandia name:hollandischer name:hollands name:hollandsbjerg name:hollandsch name:hollandsche name:hollandscheveld name:hollandsdiep name:hollandskamp name:hollandske), product of:n  1.0 = boostn  1.0 = queryNormn",

在上面的浓汤部分中,如果我们检查" parsedquery"部分,则在荷兰和荷兰*的情况下是不同的。因此,我认为,特殊字符 *不适用于同义词范围。

为了我的理解,同义词文件不支持通配符。

在您的情况下,您也可能会遇到另一个问题,因为查询中的通配符通常用于搜索不完全匹配的结果。这取决于查询中使用的查询解析器。

换句话说,查询"荷兰*"搜索以"荷兰"开头的所有文档。

如果您想将索尔视为简单角色,则应该逃脱它。

我看到的另一个错误,在您的字段定义中,您应该为情况定义analyzer类型(索引和查询(。

如果您为字段类型提供了一个简单的定义,如上面的示例,然后将其用于索引和查询。

请尝试:

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" tokenizerFactory="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

最新更新