我正在使用一个弹性搜索的php库来索引和查找我的网站中的文档.这是创建索引的代码:
curl -XPUT 'http://localhost:9200/test/' -d ' { "index": { "numberOfShards": 1, "numberOfReplicas": 1 } }'
然后我使用curl XPUT将文档添加到索引和XGET以查询索引.这种方法很有效,除了在返回结果时单个和多个查询词在索引中不匹配的事实.例如,当我搜索"讨论"时,不会返回"讨论"的匹配,反之亦然.为什么会这样?我认为默认情况下,弹性搜索会对此进行处理.有什么我们必须明确提及它匹配单数/复数形式?
默认的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"} } } } }'
不知怎的雪球对我不起作用......我得到的错误就像我在评论中提到的@ 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" } } } } }'
由于'porterStem'过滤器过于敏感,因此如果您使用'minimal_english'过滤器则更适合.'porterStem'为单词创建类似的标记,例如:
搜索'测试'将导致'测试','测试','测试','测试'等.人.
但'minimal_english'只会产生 - '测试'和'测试'.