2013-08-07 84 views
1

我在搜索/索引中非常新,我正在使用Symfony的FosElasticaBundle向Web應用程序提供搜索功能。直到我發現默認設置只允許全文搜索時,我已經設置並運行了,沒有任何問題。FOSElasticaBundle/elasticsearch部分詞匹配配置

然後,我嘗試了幾個小時,使部分單詞匹配沒有運氣。我嘗試了nGram和edgenGram等,但我真的很困惑所有的概念。我確實嘗試搜索有關概念和配置的教程,但沒有真正獲得答案。

這裏是我的配置:

fos_elastica: 
    clients: 
     default: { host: localhost, port: 9200 } 
    serializer: 
     callback_class: FOS\ElasticaBundle\Serializer\Callback 
     serializer: serializer 
    indexes: 
     website: 
      client: default 
      finder: ~ 
      settings: 
       index: 
        analysis: 
         analyzer: 
          index_analyzer: 
           tokenizer: "nGram" 
           filter: ["lowercase", "snowball"] 
          search_analyzer: 
           tokenizer: "nGram" 
           filter: ["lowercase", "snowball"] 

         filter: 
          snowball: 
           type: "snowball" 
           language: "English" 
      types: 
       client: 

        mappings: 
         BusinessName: { boost: 10 } 
         users: 
          type: "object" 
          properties: 
           firstName: { boost: 5 } 
           lastName: { boost: 5 } 
           email: { boost: 10 } 
        persistence: 
         driver: orm # orm, mongodb, propel are available 
         model: E1\Bundle\CoreBundle\Entity\Client 
         listener: 
         provider: ~ 
         finder: ~ 

該文檔是沒有幫助的。任何人都可以給我一些關於如何獲得部分詞彙匹配集和/或讓我知道我在哪裏可以找到關於概念(tokenizer,過濾器,分析器)的教程?

回答

4

如果您使用默認搜索:$resultSet = $userType->search('bob');,您將擁有非常有限的ElasticSearch功能集。

默認代碼執行Query::create($query);,它創建一個QueryString查詢。

QueryString是偉大的,因爲你可以寫通配符,它​​在默認情況下在_all現場搜索,所以如果你想匹配含有小馬文件,你必須使用$userType->search('Po*');

這裏不需要自定義分析器。標準的已經使用空格來分隔單詞和小寫的所有內容。

關於文檔和幫助,請記住Elastica是一個工具,這裏真正的搜索引擎是ElasticSearch,所以我可以給你的最好的建議是在Json中編寫和原型化你的查詢。你可以使用Head插件,或者這個Chrome Extension

+0

但是在開始或者在中間或者結束時,使用('Po *')將獲得所有'Po'或'po'文件,無論放置在哪裏。有沒有辦法限制搜索,只有以'po'開頭的元素才能找到? –