Curl Elasticsearch不返回单数/复数匹配
我正在使用elasticsearch的php库对我的网站中的文档进行索引和查找。以下是创建索引的代码:Curl Elasticsearch不返回单数/复数匹配,curl,elasticsearch,Curl,elasticsearch,我正在使用elasticsearch的php库对我的网站中的文档进行索引和查找。以下是创建索引的代码: curl -XPUT 'http://localhost:9200/test/' -d ' { "index": { "numberOfShards": 1, "numberOfReplicas": 1 } }' 然后,我使用curlxput将文档添加到索引中,并使用XGET查询索引。除了返回结果时查询词的单数和复数在整个索引中不匹配之外,这种方法工作得很好。例如,当
curl -XPUT 'http://localhost:9200/test/' -d '
{
"index": {
"numberOfShards": 1,
"numberOfReplicas": 1
}
}'
然后,我使用curlxput将文档添加到索引中,并使用XGET查询索引。除了返回结果时查询词的单数和复数在整个索引中不匹配之外,这种方法工作得很好。例如,当我搜索“讨论”时,不会返回“讨论”的匹配项,反之亦然。为什么会这样?我认为这在elasticsearch中是默认处理的。是否有什么我们必须明确提及的,以便它匹配单数/复数形式?默认的ElascticsSearch分析器不进行词干分析,这就是处理复数/单数形式所需的。您可以尝试使用for您的文本字段,看看它是否更适合您的用例:
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回答的评论中提到的那样,我遇到了错误。 我用的是porter stem,它非常适合我。这是我使用的配置:
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'为单词创建类似的标记,例如: 搜索“Test”将得到“Test”、“Tests”、“Testing”、“Tester”等结果
但是“minimal_english”只会产生“Test”和“Tests”。我尝试了这个方法,但得到了一个错误:“消息:无法加载值为[snowball]的类设置[type]”。我应该在这里安装更多的东西吗?如果是,从何处开始?您使用的是哪个版本的elasticsearch?我在0.17和master上测试了它,它在默认设置下都可以正常工作。您是否以任何方式修改了该命令?我使用的是elasticsearch 0.14。我没有修改命令-不知道为什么会出现错误。我用的是波特·斯特姆,它对我很管用。我已经添加了我在下面的答案中使用的配置。谢谢你的帮助!伊莫托夫,有一件事需要你的帮助——在你给出的例子中,你已经定义了词干分析的字段(例如代码中的mytextfield)。我如何给出应该在所有字段上进行的词干分析?非常感谢您的帮助您可以使用与创建“stem”相同的方法创建一个名为“default”的分析器,默认情况下,该分析器将应用于所有字段。或者,您可以使用动态模板()完成此操作。这是一种更复杂的方法,但它给了您更多的灵活性。我想这个特性已经出现在0.14中了,但我不是100%确定。你的答案没有被标记为正确,因为它比第一个答案来得晚,但这显然是一个更好的解决方案。雪球分析仪非常不准确。porterStem稍微好一点,可能是可用的。kstem更不敏感,minimal_english最不敏感。但是雪球很可怕。@Sekai在java代码中,可以从org.apache.lucene.analysis.en.EnglishMinimalStemFilter导入minimal\u英语,在查询中使用它将是“filter:minimal\u英语”