2016-05-13 11 views
1

私はかなり簡単なテストを行いました。私は、このインデックスに3人の生徒を追加その後分析器を使用してインデックスが正しくないelasticsearch

POST student 
{ 

    "mappings" : { 
     "ing3" : { 
      "properties" : { 
       "quote": { 
        "type": "string", 
        "analyzer": "english" 
       } 
      } 
     } 
    } 
} 

POST /student/ing3/1 
{ 
    "name": "Smith", 
    "first_name" : "John", 
    "quote" : "Learning is so cool!!" 
} 

POST /student/ing3/2 
{ 
    "name": "Roosevelt", 
    "first_name" : "Franklin", 
    "quote" : "I learn everyday" 
} 

POST /student/ing3/3 
{ 
    "name": "Black", 
    "first_name" : "Mike", 
    "quote" : "I learned a lot at school" 
} 

私は英語トークナイザがtokeniseだろうと思った。この時点で、私は学生のインデックスとタイプを構築し、その後、私はマッピングを定義します私はのような検索を作ってるんだので、もし私の引用符内のすべての単語:私のトークナイザが同じになりますので、

GET /etudiant/ing3/_search 
{ 
    "query" : { 
     "term" : { "quote" : "learn" } 
    } 
} 

が、私は結果として、すべての文書を持つことになりますが、「学習、学び、学んだ」と私は正しかったです。私はこの要求をしようとすると、しかし:

GET /student/ing3/_search 
{ 
    "query" : { 
     "term" : { "quote" : "learned" } 
    } 
} 

は私がゼロのヒットを持って、私の意見では、私は3番目の文書を持っている必要があります(少なくとも?)。しかし、私のためには、Elasticsearchはlearnedlearningのインデックスだけでなく、learnとも言われています。私が間違っている?私の要求は間違っていますか?

答えて

1

あなたがチェックした場合:

{ 
    "tokens":[ 
     { 
     "token":"i", 
     "start_offset":0, 
     "end_offset":1, 
     "type":"<ALPHANUM>", 
     "position":0 
     }, 
     { 
     "token":"learn", 
     "start_offset":2, 
     "end_offset":9, 
     "type":"<ALPHANUM>", 
     "position":1 
     }, 
     { 
     "token":"lot", 
     "start_offset":12, 
     "end_offset":15, 
     "type":"<ALPHANUM>", 
     "position":3 
     }, 
     { 
     "token":"school", 
     "start_offset":19, 
     "end_offset":25, 
     "type":"<ALPHANUM>", 
     "position":5 
     } 
    ] 
} 

だから、英語アナライザはpunctionsを削除し、その根の形で単語やトークン化ストップワード:あなたは、あなたの文は次のように分析されていることがわかります

GET 'index/_analyze?field=quote' -d "I learned a lot at school" 

GET /etudiant/ing3/_search 
{ 
    "query" : { 
     "match" : { "quote" : "learned" } 
    } 
} 
1

別の方法があります:

https://www.elastic.co/guide/en/elasticsearch/guide/current/using-language-analyzers.html

また、一致しますので、検索テキストを分析するmatchクエリを使用することができます。あなたは両方は(englishアナライザーがステマを持っている)に関して、幹だけでなく、当初の条件を維持し、keyword_repeat token filterを使用して、語幹の後に不要な重複を削除する"only_on_same_position": trueunique token filterを使用してすることができます

PUT student 
{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "myAnalyzer": { 
      "type": "custom", 
      "tokenizer": "standard", 
      "filter": [ 
      "english_possessive_stemmer", 
      "lowercase", 
      "english_stop", 
      "keyword_repeat", 
      "english_stemmer", 
      "unique_stem" 
      ] 
     } 
     }, 
     "filter": { 
     "unique_stem": { 
      "type": "unique", 
      "only_on_same_position": true 
     }, 
     "english_stop": { 
      "type": "stop", 
      "stopwords": "_english_" 
     }, 
     "english_stemmer": { 
      "type": "stemmer", 
      "language": "english" 
     }, 
     "english_possessive_stemmer": { 
      "type": "stemmer", 
      "language": "possessive_english" 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "ing3": { 
     "properties": { 
     "quote": { 
      "type": "string", 
      "analyzer": "myAnalyzer" 
     } 
     } 
    } 
    } 
} 

この場合、termクエリも機能します。あなたはどのような観点から見れば、実際にインデックス化されています:

GET /student/_search 
{ 
    "fielddata_fields": ["quote"] 
} 

今では一致した理由、それは明らかであろう。

"hits": [ 
    { 
     "_index": "student", 
     "_type": "ing3", 
     "_id": "2", 
     "_score": 1, 
     "_source": { 
      "name": "Roosevelt", 
      "first_name": "Franklin", 
      "quote": "I learn everyday" 
     }, 
     "fields": { 
      "quote": [ 
       "everydai", 
       "everyday", 
       "i", 
       "learn" 
      ] 
     } 
    }, 
    { 
     "_index": "student", 
     "_type": "ing3", 
     "_id": "1", 
     "_score": 1, 
     "_source": { 
      "name": "Smith", 
      "first_name": "John", 
      "quote": "Learning is so cool!!" 
     }, 
     "fields": { 
      "quote": [ 
       "cool", 
       "learn", 
       "learning", 
       "so" 
      ] 
     } 
    }, 
    { 
     "_index": "student", 
     "_type": "ing3", 
     "_id": "3", 
     "_score": 1, 
     "_source": { 
      "name": "Black", 
      "first_name": "Mike", 
      "quote": "I learned a lot at school" 
     }, 
     "fields": { 
      "quote": [ 
       "i", 
       "learn", 
       "learned", 
       "lot", 
       "school" 
      ] 
     } 
    } 
    ] 
関連する問題