9

我正在使用 elasticsearch 的 php 库来索引和查找我网站中的文档。这是创建索引的代码:

curl -XPUT 'http://localhost:9200/test/' -d '
{
  "index": {
    "numberOfShards": 1,
    "numberOfReplicas": 1
  }
}'

然后我使用 curl XPUT 将文档添加到索引中,并使用 XGET 来查询索引。这很好用,除了查询词的单数和复数在返回结果时在索引中不匹配。例如,当我搜索“讨论”时,不会返回“讨论”的匹配项,反之亦然。为什么会这样?我认为这是默认情况下在 elasticsearch 中处理的。为了匹配单数/复数形式,我们有什么需要明确提及的吗?

4

3 回答 3

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"}
            }
        }
    }
}'
于 2011-11-09T16:39:12.127 回答
7

不知何故,滚雪球对我不起作用......我遇到了我在@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"
            }
         }
      }
   }
}'
于 2011-11-14T05:56:17.460 回答
6

由于“porterStem”过滤器过于敏感,因此使用“minimal_english”过滤器更合适。'porterStem' 为以下词创建类似的标记:

搜索“测试”将导致您“测试”、“测试”、“测试”、“测试员”等。人。

但 'minimal_english' 只会产生 - 'Test' 和 'Tests'。

于 2012-12-20T12:10:18.010 回答