elasticsearch短语前缀停止查找

时间:2015-07-01 12:37:38

标签: indexing elasticsearch

我正在使用elasticsearch短语前缀查询进行一些自动填充。 它通常效果很好,但有时候不再找到一个不完整的单词,尽管只有一个或多一个字母就能找到它。

例如:它确实找到包含“Anomalie”的查询“Anomal”和查询“Anomalie”,但找不到“Anomali”。这对于用户体验来说真的很奇怪!

我以前的谷歌搜索让我尝试禁用停用词,但它并没有解决我的问题。我尝试在分析仪中使用stopwords配置并作为过滤器。

重现:

索引创建,配置和添加文档:

curl -XPUT 'http://localhost:9200/elastictests/' -d '{
  "settings" : {
    "index" : {
      "analysis" : {
        "filter" : {
          "french_stemmer" : {
            "type" : "stemmer",
            "name" : "light_french"
          },
          "no_stop" : {
            "type" : "stop",
            "stopwords" : "_none_"
          }
        },
        "analyzer" : {
          "default" : {
            "type" : "custom",
            "stopwords" : "_none_",
            "filter" : [ "standard", "lowercase", "asciifolding", "word_delimiter", "french_stemmer", "no_stop" ],
            "tokenizer" : "standard"
          }
        }
      }
    }
  }
}'

curl -XPUT 'http://localhost:9200/elastictests/test/1' -d '{
    "title": "Anomalie"
}'

这些查询找到文档:

curl -XGET 'http://localhost:9200/elastictests/_search?pretty=1'  -d '
{
  "query" : {
    "match" : {
        "title" : "Anomalie"
      }
    }
  }
}
'

curl -XGET 'http://localhost:9200/elastictests/_search?pretty=1'  -d '
{
  "query" : {
    "match" : {
      "title" : {
        "query": "Anomalie",
        "type": "phrase_prefix"
      }
    }
  }
}
'

curl -XGET 'http://localhost:9200/elastictests/_search?pretty=1'  -d '
{
  "query" : {
    "match" : {
      "title" : {
        "query": "Anomal",
        "type": "phrase_prefix"
      }
    }
  }
}
'

但是这个没有找到任何文件且没有错误:

curl -XGET 'http://localhost:9200/elastictests/_search?pretty=1'  -d '
{
  "query" : {
    "match" : {
      "title" : {
        "query": "Anomali",
        "type": "phrase_prefix"
      }
    }
  }
}
'

知道为什么吗?

1 个答案:

答案 0 :(得分:0)

这是因为french_stemmer Anomalie => anomal

但是 anomali 不会被 anomal 所阻止。

Anomalie的索引术语 => anomal

同样,当查询字词为 Anomalie 时,搜索字词会被分析为 anomal ,并且它与标题匹配。

然而,当查询是“Anomali”时,它会被分析为“anomali”,而不会出现词干。由于索引术语是“异常”,因此没有匹配前缀或其他。

如果从OP中描述的自定义分析器中删除干扰器,您应该获得此特定用例所需的结果

示例:

get elastictests/_analyze?field=title&text=Anomalie

{
   "tokens": [
      {
         "token": "**anomal**",
         "start_offset": 0,
         "end_offset": 8,
         "type": "<ALPHANUM>",
         "position": 1
      }
   ]
}

get elastictests/_analyze?field=title&text=Anomali
{
   "tokens": [
      {
         "token": "**anomali**",
         "start_offset": 0,
         "end_offset": 7,
         "type": "<ALPHANUM>",
         "position": 1
      }
   ]