多索引搜索(Autocomplete)咨询:跨多索引实现自动补全功能
Got it, let's tackle this problem step by step since Elasticsearch 6.x's single-type-per-index constraint is throwing a wrench in your original plan. Here's how you can replicate that single-index autocomplete behavior across your four separate indices:
1. Ensure Each Index Has a Consistent Autocomplete Field
First, you need to add a completion-type field to every one of your indices (cities, regions, countries, hotels). This is the field Elasticsearch uses for fast, optimized autocomplete lookups.
Example Mapping Update (Repeat for All Indices)
For each index, run a mapping update to add a name_suggest field (keep the name consistent across all indices to simplify queries):
PUT /cities/_mapping { "properties": { "name": { "type": "text" }, "name_suggest": { "type": "completion", "analyzer": "simple", "preserve_separators": true, "preserve_position_increments": true, "max_input_length": 50 } } }
- The
simpleanalyzer ensures basic, consistent tokenization (lowercasing, stripping special characters) across all indices. - Adjust
max_input_lengthor other completion settings based on your data's typical name length.
2. Sync Data to Populate the Autocomplete Field
Since you're using Logstash JDBC or the Reindex API, you need to make sure every document has the name_suggest field populated with the value from the name field.
Logstash Filter Example
Add this to your Logstash config's filter section to copy the name value to name_suggest:
filter { mutate { copy => { "name" => "name_suggest" } } }
Reindex API Example
If using Reindex to migrate data into these indices, include a script to populate the autocomplete field:
POST _reindex { "source": { "index": "your_source_index" }, "dest": { "index": "cities" }, "script": { "source": "ctx._source.name_suggest = ctx._source.name" } }
3. Run Cross-Index Autocomplete Searches
Now you can query all four indices at once to get unified autocomplete results. The syntax is almost identical to your single-index search—you just specify multiple indices separated by commas.
Example Autocomplete Query
POST /cities,regions,countries,hotels/_search { "suggest": { "global_name_suggest": { "prefix": "par", // Replace with user's input "completion": { "field": "name_suggest", "size": 10, // Number of results to return "skip_duplicates": true, // Remove duplicate names across indices "fuzzy": { "fuzziness": 1 // Optional: Allow minor typos for better user experience } } } } }
skip_duplicatesis useful if, for example, "Paris" exists in bothcitiesandregions—it will only return one instance.- The
fuzzyparameter adds resilience to user typos (adjustfuzzinessbased on how lenient you want to be).
4. Optional: Use Index Templates for Consistency
To avoid repeating the mapping setup for each index, create an index template that applies the name_suggest field to any new indices matching your pattern:
PUT _template/location_autocomplete_template { "index_patterns": ["cities", "regions", "countries", "hotels"], "mappings": { "properties": { "name": { "type": "text" }, "name_suggest": { "type": "completion", "analyzer": "simple" } } } }
This ensures any future updates or new indices matching the pattern will automatically have the correct autocomplete field configured.
内容的提问来源于stack exchange,提问作者Alireza Bashiri

