opensearch-docs-cn/_query-dsl/term/terms.md

252 lines
5.9 KiB
Markdown

---
layout: default
title: Terms
parent: Term-level queries
grand_parent: Query DSL
nav_order: 80
---
# Terms query
Use the `terms` query to search for multiple terms in the same field. For example, the following query searches for lines with the IDs `61809` and `61810`:
```json
GET shakespeare/_search
{
"query": {
"terms": {
"line_id": [
"61809",
"61810"
]
}
}
}
```
{% include copy-curl.html %}
A document is returned if it matches any of the terms in the array.
By default, the maximum number of terms allowed in a `terms` query is 65,536. To change the maximum number of terms, update the `index.max_terms_count` setting.
The ability to [highlight results]({{site.url}}{{site.baseurl}}/search-plugins/searching-data/highlight/) for terms queries may not be guaranteed, depending on the highlighter type and the number of terms in the query.
{: .note}
## Parameters
The query accepts the following parameters. All parameters are optional.
Parameter | Data type | Description
:--- | :--- | :---
`<field>` | String | The field in which to search. A document is returned in the results only if its field value exactly matches at least one term, with the correct spacing and capitalization.
`boost` | Floating-point | Boosts the query by the given multiplier. Useful for searches that contain more than one query. Values in the [0, 1) range decrease relevance, and values greater than 1 increase relevance. Default is `1`.
## Terms lookup
Terms lookup retrieves the field values of a single document and uses them as search terms. You can use terms lookup to search for a large number of terms.
To use terms lookup, you must enable the `_source` mapping field because terms lookup fetches values from a document. The `_source` field is enabled by default.
Terms lookup tries to fetch the document field values from a shard on a local data node. Thus, using an index with a single primary shard that has full replicas on all applicable data nodes reduces network traffic.
### Example
As an example, create an index that contains student data, mapping `student_id` as a `keyword`:
```json
PUT students
{
"mappings": {
"properties": {
"student_id": { "type": "keyword" }
}
}
}
```
{% include copy-curl.html %}
Next, index three documents that correspond to students:
```json
PUT students/_doc/1
{
"name": "Jane Doe",
"student_id" : "111"
}
```
{% include copy-curl.html %}
```json
PUT students/_doc/2
{
"name": "Mary Major",
"student_id" : "222"
}
```
{% include copy-curl.html %}
```json
PUT students/_doc/3
{
"name": "John Doe",
"student_id" : "333"
}
```
{% include copy-curl.html %}
Create a separate index that contains class information, including the class name and an array of student IDs corresponding to the students enrolled in the class:
```json
PUT classes/_doc/101
{
"name": "CS101",
"enrolled" : ["111" , "222"]
}
```
{% include copy-curl.html %}
To search for students enrolled in the `CS101` class, specify the document ID of the document that corresponds to the class, the index of that document, and the path of the field in which the terms are located:
```json
GET students/_search
{
"query": {
"terms": {
"student_id": {
"index": "classes",
"id": "101",
"path": "enrolled"
}
}
}
}
```
{% include copy-curl.html %}
The response contains the documents in the `students` index for every student whose ID matches one of the values in the `enrolled` array:
```json
{
"took": 13,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "students",
"_id": "1",
"_score": 1,
"_source": {
"name": "Jane Doe",
"student_id": "111"
}
},
{
"_index": "students",
"_id": "2",
"_score": 1,
"_source": {
"name": "Mary Major",
"student_id": "222"
}
}
]
}
}
```
### Example: Nested fields
The second example demonstrates querying nested fields. Consider an index with the following document:
```json
PUT classes/_doc/102
{
"name": "CS102",
"enrolled_students" : {
"id_list" : ["111" , "333"]
}
}
```
{% include copy-curl.html %}
To search for students enrolled in `CS102`, use the dot path notation to specify the full path to the field in the `path` parameter:
```json
ET students/_search
{
"query": {
"terms": {
"student_id": {
"index": "classes",
"id": "102",
"path": "enrolled_students.id_list"
}
}
}
}
```
{% include copy-curl.html %}
The response contains the matching documents:
```json
{
"took": 18,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "students",
"_id": "1",
"_score": 1,
"_source": {
"name": "Jane Doe",
"student_id": "111"
}
},
{
"_index": "students",
"_id": "3",
"_score": 1,
"_source": {
"name": "John Doe",
"student_id": "333"
}
}
]
}
}
```
### Parameters
The following table lists the terms lookup parameters.
Parameter | Data type | Description
:--- | :--- | :---
`index` | String | The name of the index in which to fetch field values. Required.
`id` | String | The document ID of the document from which to fetch field values. Required.
`path` | String | The name of the field from which to fetch field values. Specify nested fields using dot path notation. Required.
`routing` | String | Custom routing value of the document from which to fetch field values. Optional. Required if a custom routing value was provided when the document was indexed.