我使用的是弹性搜索的php库来索引和查找我网站上的文档。这是用于创建索引的代码:
curl -XPUT 'http://localhost:9200/test/' -d '
{
"index": {
"numberOfShards": 1,
"numberOfReplicas": 1
}
}'
然后我使用curl XPUT将文档添加到索引和XGET来查询索引。这种方法很有效,除了在返回结果时单个和多个查询词在索引中不匹配的事实。例如,当我搜索“讨论”时,不会返回“讨论”的匹配,反之亦然。为什么会这样?我认为默认情况下,弹性搜索会对此进行处理。有没有什么我们必须明确提及它匹配单数/复数形式?
答案 0 :(得分:7)
默认的elascticsearch分析仪不会产生干扰,这就是你需要处理复数/单数。您可以尝试使用Snowball Analyzer作为文本字段,以查看它是否更适合您的用例:
curl -XPUT 'http://localhost:9200/test' -d '{
"settings" : {
"index" : {
"number_of_shards" : 1,
"number_of_replicas" : 1
}
},
"mappings" : {
"page" : {
"properties" : {
"mytextfield": { "type": "string", "analyzer": "snowball", "store": "yes"}
}
}
}
}'
答案 1 :(得分:6)
不知怎的雪球对我不起作用......我得到的错误就像我在评论中提到的@ imotov的答案。 我使用了搬运工干,它对我来说很有效。这是我使用的配置:
curl -XPUT localhost:9200/index_name -d '
{
"settings" : {
"analysis" : {
"analyzer" : {
"stem" : {
"tokenizer" : "standard",
"filter" : ["standard", "lowercase", "stop", "porter_stem"]
}
}
}
},
"mappings" : {
"index_type_1" : {
"dynamic" : true,
"properties" : {
"field1" : {
"type" : "string",
"analyzer" : "stem"
},
"field2" : {
"type" : "string",
"analyzer" : "stem"
}
}
}
}
}'
答案 2 :(得分:6)
由于'porterStem'过滤器过于敏感,因此如果您使用'minimal_english'过滤器则更适合。 'porterStem'为单词创建类似的标记,例如:
搜索“测试”将导致您“测试”,“测试”,“测试”,“测试者”等。人
但'minimal_english'只会产生 - '测试'和'测试'。