2

私はElasticsearchが初めてで、クエリに関して問題があります。

そのような文字列にインデックスを付けました:

my-super-string
my-other-string
my-little-string

この文字列はナメクジです。したがって、これらはスペースではなく、英数字のみです。関連フィールドのマッピングは「type=string」のみです。

私は次のようなクエリを使用しています:

{ "query":{ "query_string":{ "query": "*"+<MY_QUERY>+"*", "rewrite": "top_terms_10" } }}

「MY_QUERY」もスラッグです。たとえば、「my-super」のようなもの。

「私の」を検索すると、結果が得られます。

「my-super」を検索しても結果が得られず、「my-super-string」が必要です。

誰かがこれについて私を助けることができますか? ありがとう!

4

1 に答える 1

1

クエリ文字列の先頭と末尾にワイルドカードを使用する代わりに、match_phrase を使用することをお勧めします。標準のアナライザーでもスラッグをトークンに正しく分割できるはずなので、ワイルドカードは必要ありません。

curl -XPUT "localhost:9200/slugs/doc/1" -d '{"slug": "my-super-string"}'
echo
curl -XPUT "localhost:9200/slugs/doc/2" -d '{"slug": "my-other-string"}'
echo
curl -XPUT "localhost:9200/slugs/doc/3" -d '{"slug": "my-little-string"}'
echo
curl -XPOST "localhost:9200/slugs/_refresh"
echo
echo "Searching for my"
curl "localhost:9200/slugs/doc/_search?pretty=true&fields=slug" -d '{"query" : { "match_phrase": {"slug": "my"} } }'
echo
echo "Searching for my-super"
curl "localhost:9200/slugs/doc/_search?pretty=true&fields=slug" -d '{"query" : { "match_phrase": {"slug": "my-super"} } }'
echo
echo "Searching for my-other"
curl "localhost:9200/slugs/doc/_search?pretty=true&fields=slug" -d '{"query" : { "match_phrase": {"slug": "my-other"} } }'
echo
echo "Searching for string"
curl "localhost:9200/slugs/doc/_search?pretty=true&fields=slug" -d '{"query" : { "match_phrase": {"slug": "string"} } }'

または、「-」でのみスラッグをトークンに分割する独自のアナライザーを作成できます。

curl -XDELETE localhost:9200/slugs
curl -XPUT localhost:9200/slugs -d '{
    "settings": {
        "index": {
            "number_of_shards": 1,
            "number_of_replicas": 0,
            "analysis": {
                "analyzer" : {
                    "slug_analyzer" : {
                        "tokenizer": "slug_tokenizer",
                        "filter" : ["lowercase"]
                    }
                },
                "tokenizer" :{
                    "slug_tokenizer" : {
                        "type": "pattern",
                        "pattern": "-"
                    }
                }
            }
        }
    },
    "mappings" :{
        "doc" : {
            "properties" : {
                "slug" : {"type": "string", "analyzer" : "slug_analyzer"}
            }
        }
    }
}'
于 2012-11-16T03:32:52.970 に答える