2011-11-09 121 views
9

我正在使用elasticsearch的php庫來索引和查找我的網站中的文檔。這是創建索引的代碼:Elasticsearch不返回單數/複數匹配

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

然後我用捲曲XPUT將文檔添加到索引和XGET查詢索引。除了單數和複數查詢詞在索引中不匹配而返回結果這一事實之外,這很有效。例如,當我搜索「討論」時,不會返回「討論」的匹配,反之亦然。這是爲什麼?我認爲這是默認情況下在elasticsearch中的照顧。有什麼我們必須明確提及它以匹配單數/複數形式嗎?

回答

6

不知爲什麼雪球不是爲我工作......我得到的錯誤:您可以嘗試使用Snowball Analyzer爲您的文本字段,看它是否適合你的使用情況較好。 我使用了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" 
      } 
     } 
     } 
    } 
}' 
7

默認的elascticsearch分析器不會做詞幹,這是你需要處理複數/單數。像我在評論中提及到@ imotov的回答

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"} 
      } 
     } 
    } 
}' 
+0

感謝您的回答。讓我試試看看它是否有效 – Ninja

+0

我試過這個,我得到一個錯誤:「消息:無法加載值[雪球]類設置[類型]」。我應該在這裏安裝更多東西嗎?如果是的話,從哪裏來? – Ninja

+0

您使用的是哪個版本的elasticsearch?我在0.17和主控上進行了測試,它在默認設置下都可以正常工作。你是否以任何方式修改命令? – imotov

6

由於「porterStem」過濾器是過敏,如果你用「minimal_english」過濾器是更適合。 'porterStem'爲單詞創建相似的標記,例如:

搜索'Test'會導致您'Test','Tests','Testing','Tester'等。人。

但'minimal_english'只會產生 - '測試'和'測試'。

+2

由於比第一輪比賽要晚得多,所以你的回答沒有被正確標記,但這顯然是一個更好的解決方案。雪球分析儀是非常不準確的。 porterStem更好一些,並且可能可用。 kstem更不敏感,而minimal_english是最不敏感的。但是,雪球是可怕的。 –

+2

我找不到minimal_english .. – Sekai

+0

@Sekai在你的java代碼中minimal_english可以從org.apache.lucene.analysis.en.EnglishMinimalStemFilter中導入,並且在查詢中使用它將是「filter:minimal_english」 –