所以我有这种情况我们有很多文件都有像US-2343或FX-4321这样的标题....我使用雪球分析仪作为索引的默认分析器,但是我有这个奇怪的问题
说我有以下文件US-4321,US-2343,US-2300 ...... 当我搜索“us-2300”时,一个文档按预期显示(连字符在搜索中被转义)但是当我搜索“us-23 *”时...没有显示,但是如果我进行搜索对于“我们23 *”(注意空格)然后我们-2343和我们-2300出现
我试图理解为什么它会这样运作。有什么想法吗?
答案 0 :(得分:2)
您可以使用Analyze API检查文档的编制方式。如您所见,您的文档被编入索引为两个令牌:us
和2343
。
$ curl "localhost:9200/your_index/_analyze?analyzer=snowball&pretty=true" -d "US-2343"
{
"tokens" : [ {
"token" : "us",
"start_offset" : 0,
"end_offset" : 2,
"type" : "<ALPHANUM>",
"position" : 1
}, {
"token" : "2343",
"start_offset" : 3,
"end_offset" : 7,
"type" : "<NUM>",
"position" : 2
} ]
}
当您搜索us-23*
时,elasticsearch正在尝试查找包含以us-23
开头的令牌的文档。这是因为未分析通配符表达式。如您所见,snowball
解析器不会生成此类令牌,因此不会返回任何结果。当您搜索两个令牌us
和前缀为23
的令牌时,您会收到结果。
看看text_phrase_prefix
query。它可能更适合您的需求。
答案 1 :(得分:1)
如果你使用Analyze API,你会发现你的标题如何被分解为术语。
我认为US-4321被编入索引为我们和4321.当您搜索“us 4321”(使用QueryString或MatchQuery)时,它会找到我们所有的条款和所有4321条款。
要回答更多问题,最好在查询中提供更多详细信息。
如果您的标题包含“ - ”并且在您的使用案例中很重要,则应使用其他分析器。 顺便说一句,使用通配符比使用ngram或edgengram分析器更昂贵(从性能POV)。
HTH 大卫