search_analyzer
通常、同じ analyzer はインデックス時と検索時の両方で適用されるべきであり、クエリ内の用語が反転インデックス内の用語と同じ形式であることを保証します。
ただし、オートコンプリートのために edge_ngram
トークナイザーを使用する場合や、検索時の同義語を使用する場合など、検索時に異なるアナライザーを使用することが理にかなうことがあります。
デフォルトでは、クエリはフィールドマッピングで定義された analyzer
を使用しますが、search_analyzer
設定で上書きすることができます:
Python
resp = client.indices.create(
index="my-index-000001",
settings={
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 20
}
},
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
}
},
mappings={
"properties": {
"text": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "standard"
}
}
},
)
print(resp)
resp1 = client.index(
index="my-index-000001",
id="1",
document={
"text": "Quick Brown Fox"
},
)
print(resp1)
resp2 = client.search(
index="my-index-000001",
query={
"match": {
"text": {
"query": "Quick Br",
"operator": "and"
}
}
},
)
print(resp2)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
settings: {
analysis: {
filter: {
autocomplete_filter: {
type: 'edge_ngram',
min_gram: 1,
max_gram: 20
}
},
analyzer: {
autocomplete: {
type: 'custom',
tokenizer: 'standard',
filter: [
'lowercase',
'autocomplete_filter'
]
}
}
}
},
mappings: {
properties: {
text: {
type: 'text',
analyzer: 'autocomplete',
search_analyzer: 'standard'
}
}
}
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 1,
body: {
text: 'Quick Brown Fox'
}
)
puts response
response = client.search(
index: 'my-index-000001',
body: {
query: {
match: {
text: {
query: 'Quick Br',
operator: 'and'
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000001",
settings: {
analysis: {
filter: {
autocomplete_filter: {
type: "edge_ngram",
min_gram: 1,
max_gram: 20,
},
},
analyzer: {
autocomplete: {
type: "custom",
tokenizer: "standard",
filter: ["lowercase", "autocomplete_filter"],
},
},
},
},
mappings: {
properties: {
text: {
type: "text",
analyzer: "autocomplete",
search_analyzer: "standard",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "my-index-000001",
id: 1,
document: {
text: "Quick Brown Fox",
},
});
console.log(response1);
const response2 = await client.search({
index: "my-index-000001",
query: {
match: {
text: {
query: "Quick Br",
operator: "and",
},
},
},
});
console.log(response2);
Console
PUT my-index-000001
{
"settings": {
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 20
}
},
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
}
},
"mappings": {
"properties": {
"text": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "standard"
}
}
}
}
PUT my-index-000001/_doc/1
{
"text": "Quick Brown Fox"
}
GET my-index-000001/_search
{
"query": {
"match": {
"text": {
"query": "Quick Br",
"operator": "and"
}
}
}
}
カスタム autocomplete アナライザーを定義するための分析設定。 |
|
text フィールドはインデックス時に autocomplete アナライザーを使用しますが、検索時には standard アナライザーを使用します。 |
|
このフィールドは次の用語としてインデックスされます: [ q , qu , qui , quic , quick , b , br , bro , brow , brown , f , fo , fox ] |
|
クエリはこれらの用語の両方を検索します: [ quick , br ] |
この例の完全な説明については、インデックス時の検索-タイプを参照してください。
search_analyzer
設定は、マッピングの更新 API を使用して既存のフィールドで更新できます。 これを行うには、既存の「analyzer」設定と「type」を更新されたフィールド定義に繰り返す必要があることに注意してください。