# 検索文字からドキュメントの完全一致をしたい

**URL:** <https://discuss.elastic.co/t/topic/74635>\
**Category:** 日本語による質問・議論はこちら\
**Created:** [February 10, 2017, 10:24am UTC](https://discuss.elastic.co/t/topic/74635 "2017-02-10T10:24:29Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![soraiyu](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/soraiyu/32/15420_2.png) [@soraiyu](https://discuss.elastic.co/u/soraiyu)\
**Post date:** [February 10, 2017, 10:24am UTC](https://discuss.elastic.co/t/topic/74635/1 "2017-02-10T10:24:29Z")

</div>

専門用語の辞書を作成しています。

以下のようなドキュメントが入っています。

1. 赤パジャマ
2. 青パジャマ
3. 黄パジャマ

この文字を以下で検索します。

- 僕は黄パジャマを着たい。貴方は赤パジャマにしたら？

文字列が以下のように形態素解析されるとして、

`僕 は 黄 パジャマ を 着たい。 貴方 は 赤 パジャマ に したら？`

その結果以下が欲しいです。

- 青パジャマ
- 赤パジャマ

## 試した方法と考えた解決案

### 1. ドキュメントを解析(デフォルト)

- ドキュメント

```auto
赤パジャマ → 赤、パジャマ → 赤(0:0)、パジャマ(0:1)
青パジャマ → 青、パジャマ → 青(1:0)、パジャマ(1:1)
黄パジャマ → 黄、パジャマ → 黄(2:0)、パジャマ(2:1)

```

- インデックス

```auto
赤 0:0
青 1:0
黄 2:0
パジャマ 0:1, 1:1, 2:1

```

- 検索

```auto
赤 0:0
黄 2:0
パジャマ 0:1, 1:1, 2:1

```

→ 0, 1, 2全部ヒットする

### 2. ドキュメントをnot\_analyzed

検索する文字列が不適切に分割された場合にヒットしない  
赤、パジャマと分割されているのでヒットしない

## 解決案

解析済みのテキストにはポジションがあるので以下のようにできないか考えています。  
1でインデックスを検索した結果以下のように想定できます。

```auto
赤 0:0
黄 2:0
パジャマ 0:1, 1:1, 2:1

```

その結果、全てがヒットしますが、ドキュメントに着目すると

```auto
0:0, 0:1 → 赤パジャマ
1:1 → パジャマ
2:0, 2:1 → 黄パジャマ

```

となり、1:0が無いので青パジャマを除外できるのじゃないかと考えました。

検索クエリでこのpositionやドキュメントIDの演算ができるのか、  
また別な解決策があれば教えていただきたいです。

---

<div class="post-metadata">

**Author:** ![johtani](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/johtani/32/44956_2.png) [@johtani](https://discuss.elastic.co/u/johtani)\
**Post date:** [February 10, 2017, 2:09pm UTC](https://discuss.elastic.co/t/topic/74635/2 "2017-02-10T14:09:12Z")

</div>

問題点がよくわかっていないですが、フレーズのクエリを利用してみてはどうでしょうか？  
[https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query-phrase.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query-phrase.html)

---

<div class="post-metadata">

**Author:** ![soraiyu](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/soraiyu/32/15420_2.png) [@soraiyu](https://discuss.elastic.co/u/soraiyu)\
**Post date:** [February 10, 2017, 2:29pm UTC](https://discuss.elastic.co/t/topic/74635/3 "2017-02-10T14:29:29Z")

</div>

大谷さん、ありがとうございます

でも違うんです。  
検索するキーワードの中に、既にあるドキュメントが完全一致してるのをヒットさせたいんです。

フレーズは、検索する文字列の話だと理解しています。

---

<div class="post-metadata">

**Author:** ![johtani](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/johtani/32/44956_2.png) [@johtani](https://discuss.elastic.co/u/johtani)\
**Post date:** [February 10, 2017, 2:45pm UTC](https://discuss.elastic.co/t/topic/74635/4 "2017-02-10T14:45:03Z")

</div>

インデックスするフィールドも同じAnalyzerを利用すれば、フレーズ検索の場合は隣り合ってるものしか出てこないですよ？

あとは、こういう機能もありますね。  
[https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-percolate-query.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-percolate-query.html)

---

<div class="post-metadata">

**Author:** ![soraiyu](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/soraiyu/32/15420_2.png) [@soraiyu](https://discuss.elastic.co/u/soraiyu)\
**Post date:** [February 10, 2017, 2:50pm UTC](https://discuss.elastic.co/t/topic/74635/5 "2017-02-10T14:50:22Z")

</div>

お、、なるほど。僕の理解不足です  
試してみます！

---

<div class="post-metadata">

**Author:** ![soraiyu](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/soraiyu/32/15420_2.png) [@soraiyu](https://discuss.elastic.co/u/soraiyu)\
**Post date:** [February 13, 2017, 4:22am UTC](https://discuss.elastic.co/t/topic/74635/6 "2017-02-13T04:22:33Z")

</div>

@johtani  
フレーズ検索で試してみました。  
ドキュメントに[赤パジャマ, 青パジャマ, 黄パジャマ] の3つが入っているときに[赤パジャマ上]でフレーズ検索すると引っかかりません。  
やりたいことは[赤パジャマ上]で検索して[赤パジャマ]をヒットさせることです。

通常の検索だと[赤パジャマ上]で検索すると[赤パジャマ, 青パジャマ, 黄パジャマ] がヒットします。  
ここから[赤パジャマ]だけにしたいんです。  
ドキュメント見ながらクエリをどう組み立てればいいか再度見てみます。

---

<div class="post-metadata">

**Author:** ![soraiyu](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/soraiyu/32/15420_2.png) [@soraiyu](https://discuss.elastic.co/u/soraiyu)\
**Post date:** [February 13, 2017, 12:46pm UTC](https://discuss.elastic.co/t/topic/74635/7 "2017-02-13T12:46:59Z")

</div>

普通に検索して、その結果のドキュメントが検索する文字列に含まれてるものにプログラム内で絞る方法で一旦考えて進めます。

---

<div class="post-metadata">

**Author:** ![soraiyu](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/soraiyu/32/15420_2.png) [@soraiyu](https://discuss.elastic.co/u/soraiyu)\
**Post date:** [February 22, 2017, 2:43am UTC](https://discuss.elastic.co/t/topic/74635/8 "2017-02-22T02:43:29Z")

</div>

ngramで解析して、検索した結果が検索文字列に含まれるもののみプログラムで間引きました。

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [March 22, 2017, 2:43am UTC](https://discuss.elastic.co/t/topic/74635/9 "2017-03-22T02:43:44Z")

</div>

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