簡単なサーチ!

すみません、
私の日本語は下手です、でも日本語の質問です。
documents: {
"title": "あいうえお",
"description": "...スポーツ。2016年リオオリンピックが終了しました。..."
}
keyword: 2016年
バージョン: 5.2.2
mapping: Kuromoji_tokenizerを使います。

query:

...
'query_string': {
'fields': [
'title^10',
'title.^4',
'description^2',
'description.
^2'
],
'query': u'2016年*',
'default_operator': 'AND',
'analyzer': 'keyword',
'fuzziness': 'auto'
}
...

これダメです!

英語で、たぶん分かりやすい:
I have the below description in my document, searching for the keyword: "2016年", but can't hit.
The Kuromoji tokenizer generate: 2016 and 年 But what the user is looking for is 2016年.
Same problem if the user search for "50才" or "05月04日".
How we can this search hit?

手伝ってお願いします!
m(__)m

クエリのanalyzer: "keyword" は正しいですか?

2016年は、 "2016" と "年” の2つのトークンに分かれて格納されます。
なので、検索時にも検索クエリが ”2016年"という1tokenではなく、"2016"と"年"とならなければヒットしないと思います。
検索対象のフィールドに設定したanalyzerと異なるanalyzerを検索時に指定していないかどうかが気になりました。

私の環境で試した内容は次の通りですが、検索することができました。

Mapping Configuration

analyzer name = "kuromoji"

PUT forum1
{
  "settings": {
    "index": {
      "number_of_shards": "1",
      "number_of_replicas": "0"
    },
    "analysis": {
      "tokenizer": {
        "kuromoji": {
          "type": "kuromoji_tokenizer",
          "mode": "search"
        }
      },
      "analyzer": {
        "kuromoji": {
          "type": "custom",
          "tokenizer": "kuromoji",
          "filter": [
            "kuromoji_baseform",
            "kuromoji_part_of_speech"
          ]
        }
      }
    }
  },
  "mappings": {
    "test": {
      "properties": {
        "title": {
          "type": "text",
          "analyzer": "kuromoji",
          "fielddata": true
        },
        "description": {
          "type": "text",
          "analyzer": "kuromoji"
        }
      }
    }
  }
}

Indexing

POST forum1/test/1
{
  "title": "あいうえお",
  "description": "...スポーツ。2016年リオオリンピックが終了しました。..."
}

Search

using analyzer = kuromoji

GET forum1/_search
{
  "query": {
    "simple_query_string" : {
      "fields": [
        "title^10",
        "title.*^4",
        "description^2",
        "description.*^2"
        ],
        "query": "2016年",
        "analyzer": "kuromoji",
        "default_operator": "AND"
  }
 }
}

and result is below.

{
  "took": 5,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1.1395401,
    "hits": [
      {
        "_index": "forum1",
        "_type": "test",
        "_id": "1",
        "_score": 1.1395401,
        "_source": {
          "title": "あいうえお",
          "description": "...スポーツ。2016年リオオリンピックが終了しました。..."
        }
      }
    ]
  }
}

if using analyzer = "keyword", no hits.

best regards.

1 Like

@tsgkdt ありがとうございます!

問題はkuromojiのアナライザーを使えれば、"...スポーツ。2015年リオオリンピックが終了しました。..." と "2016-05-05" etc...
hitsは多すぎです。

おかの例は:
”16才” ---> "16第の話、1才から。。。" がhitします。
だからkeywordアナライザーを使います。

英語で:
What I want is the full word 2016年 or 16才 only documents with 16 and 才 not all documents with 16 and all documents with 才.
I hope it's more clear, sorry for the misunderstood and great thanks for the help.

クエリを " で囲うのはどうでしょう?

2016年 では、 「2016回目のプロポーズ、平成29年。」は、ヒットしますが
"2016年"とすることにより、 ”2016"と”年”が連続して出現するところを探すようになります。

please confirm below.

GET forum1/_search
{
  "query": {
    "simple_query_string" : {
      "fields": [
        "title^10",
        "title.*^4",
        "description^2",
        "description.*^2"
        ],
        "query": "\"2016年\"",
        "analyzer": "kuromoji",
        "default_operator": "AND"
  }
 }
}

best regards

hehehe " で囲うは忘れました。。。 :sweat:

I'll give a try ありがとうございます。

または Phrase Queryも良いかもしれません。
https://www.elastic.co/guide/en/elasticsearch/reference/5.4/query-dsl-match-query-phrase.html#query-dsl-match-query-phrase

example.

GET forum1/_search
{
  "query": {
    "match_phrase": {
      "description": "2016年"
    }
  }
}

Thanks for the help.

The case was more complex and I figure out another solution that didn't broke all my unit test.
Thanks a lot for the help.

ありがとうございます m(__)m

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.