6

「userName」フィールドを持つ 3 つのドキュメントがあります。

  • 「ブリアンディリー」
  • 「ブリアンブル」
  • 「ブリアンリフェン」

「brian」を検索すると、3 つすべてが期待どおりに返されますが、「briandilley」を検索すると、3 つすべてが返されます。分析 API は、検索文字列に ngram フィルターを使用していると言っていますが、その理由はわかりません。これが私のセットアップです:

インデックス設定:

{
    "analysis": {
        "analyzer": {
            "username_index": {
                "tokenizer": "keyword",
                "filter": ["lowercase", "username_ngram"]
            },
            "username_search": {
                "tokenizer": "keyword",
                "filter": ["lowercase"]
            }
        },
        "filter": {
            "username_ngram": {
                "type": "edgeNGram",
                "side" : "front",
                "min_gram": 1,
                "max_gram": 15
            }
        }
    }
}

マッピング:

{
    "user_follow": {

        "properties": {
            "targetId": { "type": "string", "store": true },
            "followerId": { "type": "string", "store": true },
            "dateUpdated": { "type": "date", "store": true },

            "userName": {
                "type": "multi_field",
                "fields": {
                    "userName": {
                        "type": "string",
                        "index": "not_analyzed"
                    },
                    "autocomplete": {
                        "type": "string",
                        "index_analyzer": "username_index",
                        "search_analyzer": "username_search"
                    }
                }
            }
        }
    }
}

探す:

{
    "from" : 0,
    "size" : 50,
    "query" : {
        "bool" : {
            "must" : [ {
                "field" : {
                    "targetId" : "51888c1b04a6a214e26a4009"
                }
            }, {
                "match" : {
                    "userName.autocomplete" : {
                        "query" : "brian",
                        "type" : "boolean"
                    }
                }
            } ]
        }
    },
    "fields" : "followerId"
}

matchQuery、matchPhraseQuery、textQuery、および termQuery (Java DSL API) を試しましたが、毎回同じ結果が得られます。

4

1 に答える 1