3

これはステミングに関係していると確信しており、スペル候補を取得して単語全体を返すために何を変更する必要があるのか​​ わかりません。

設定は次のとおりです。

ELASTICSEARCH_INDEX_SETTINGS = {
  'settings': {
    "analysis": {
        "analyzer": {
            "default": {
                "type": "custom",
                "tokenizer": "standard",
                "filter": ["standard", "lowercase", "stop_words", "cm_snow"]
            },
            "ngram_analyzer": {
                "type": "custom",
                "tokenizer": "lowercase",
                "filter": ["haystack_ngram"]
            },
            "edgengram_analyzer": {
                "type": "custom",
                "tokenizer": "lowercase",
                "filter": ["haystack_edgengram"]
            }
        },
        "tokenizer": {
            "haystack_ngram_tokenizer": {
                "type": "nGram",
                "min_gram": 3,
                "max_gram": 15,
            },
            "haystack_edgengram_tokenizer": {
                "type": "edgeNGram",
                "min_gram": 2,
                "max_gram": 15,
                "side": "front"
            }
        },
        "filter": {
            "haystack_ngram": {
                "type": "nGram",
                "min_gram": 3,
                "max_gram": 15
            },
            "haystack_edgengram": {
                "type": "edgeNGram",
                "min_gram": 2,
                "max_gram": 15
            },
            "cm_snow": {
                "type": "snowball",
                "language": "English"
            },
            "stop_words": {
                "type": "stop",
                "ignore_case": True,
                "stopwords": STOP_WORDS
            }
        }
    }
  }
}

Elasticsearch に対して次のクエリを実行すると、次のようになります。

curl -XPOST 'localhost:9200/listing/_suggest' -d '{
  "my-suggestion" : {
    "text" : "table",
    "term" : {
      "field" : "text"
    }
  }
}'

私は戻ってきます:

{"text":"tabl","offset":0,"length":5,"options":[]}

スペルが正しい単語であっても、結果が "tabl" になるのはなぜですか?

4

1 に答える 1

3

問題は、私がデフォルトのアナライザーを使用していて、デフォルトのアナライザーが Snowball を使用していたことです。これは Snowball index_analyzer を使用していたため、単語は語幹としてインデックスを取得していました。

語幹を付けた単語を引き続き検索したいので、標準アナライザーを使用するドキュメント呼び出しの suggest に追加のフィールドを追加しました。その中に、そのドキュメントの一連の単語 (タイトル、説明、タグ) のテキスト blob を入れ、マークはinclude_in_all=false次のようになります。そのマッピングは次のとおりです。

"suggest": {
    "type": "string",
    "analyzer": "standard"
},

次に、クエリで _all に対してクエリを実行して実際の検索結果を取得しますが、提案にはサジェストを使用します。

{
  "query": {
     "match": {
         "_all": "tabel"
     }
  },
  "suggest": {
    "suggest-0": {
      "term": {
        "field": "suggest",
        "size": 5
      },
      "text": "tabls"
    }
  }
}

これにより、次のことが得られます。

{
    "took": 7,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
        "total": 0,
        "max_score": null,
        "hits": []
    },
    "suggest": {
        "suggest-0": [
            {
                "text": "tabls",
                "offset": 0,
                "length": 5,
                "options": [
                    {
                        "text": "table",
                        "score": 0.8,
                        "freq": 858
                    },
                    {
                        "text": "tables",
                        "score": 0.8,
                        "freq": 682
                    },
                    {
                        "text": "tails",
                        "score": 0.8,
                        "freq": 4
                    },
                    {
                        "text": "tabs",
                        "score": 0.75,
                        "freq": 4
                    },
                    {
                        "text": "tools",
                        "score": 0.6,
                        "freq": 176
                    }
                ]
            }
        ]
    }
}

そして、私の UI コードは、ユーザーがより適切な検索を行えるように、ユーザーに提案を提示することを認識しています。

于 2014-04-28T15:07:42.753 に答える