elasticsearch,Curl,elasticsearch" /> elasticsearch,Curl,elasticsearch" />

Curl Elasticsearch不返回单数/复数匹配

Curl Elasticsearch不返回单数/复数匹配,curl,elasticsearch,Curl,elasticsearch,我正在使用elasticsearch的php库对我的网站中的文档进行索引和查找。以下是创建索引的代码: curl -XPUT 'http://localhost:9200/test/' -d ' { "index": { "numberOfShards": 1, "numberOfReplicas": 1 } }' 然后,我使用curlxput将文档添加到索引中,并使用XGET查询索引。除了返回结果时查询词的单数和复数在整个索引中不匹配之外,这种方法工作得很好。例如,当

我正在使用elasticsearch的php库对我的网站中的文档进行索引和查找。以下是创建索引的代码:

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英语”