Dynamic Search
Dynamic Search tải lựa chọn từ API từ xa theo thời gian thực khi người điều tra gõ, cho phép xử lý tập dữ liệu lớn hoặc cập nhật thường xuyên.
Dynamic Search (còn gọi là Search API) cho phép trường select_one, select_multiple, hoặc text tải lựa chọn từ dịch vụ web từ xa lúc chạy khi người điều tra gõ. Đây là cách tiếp cận đúng khi danh sách lựa chọn quá lớn để đóng gói trong tệp CSV, được cập nhật thường xuyên, hoặc đến từ cơ sở dữ liệu trực tiếp.
Appearance search-api()
Tìm kiếm động được cấu hình qua cột appearance bằng hàm search-api():
search-api(method, url, post_body, value_column, display, data_path, save_path)
Tham số
| Tham số | Mô tả |
|---|---|
method | Luôn dùng 'POST' |
url | Endpoint API để truy vấn |
post_body | Body JSON gửi đến API. Dùng %__input__% làm placeholder cho văn bản tìm kiếm hiện tại của người điều tra |
value_column | Khóa trong đối tượng phản hồi để dùng làm giá trị được lưu |
display | Khóa (hoặc mẫu) để dùng làm nhãn hiển thị trong danh sách thả xuống. Hỗ trợ placeholder ##key## và biểu thức @{func} |
data_path | JSONPath đến mảng đối tượng kết quả trong phản hồi (ví dụ: $.data, $.hits.hits.*._source) |
save_path | Tên để lưu phản hồi thô để các trường khác dùng |
Ví dụ cơ bản
Tra cứu cơ sở y tế nơi người điều tra gõ một phần tên cơ sở:
| type | name | label | appearance |
|---|---|---|---|
| select_one | facility | Chọn cơ sở y tế | search-api('POST', 'https://api.example.com/facilities/search', '{"query": "%__input__%"}', 'id', 'name', '$.results', 'facility_data') |
API nhận {"query": "nair"} khi người điều tra gõ “nair” và trả về:
{
"results": [
{"id": "HF001", "name": "Nairobi Central Clinic"},
{"id": "HF002", "name": "Nairobi West Hospital"}
]
}
Danh sách thả xuống hiển thị Nairobi Central Clinic và Nairobi West Hospital; giá trị được lưu là HF001 hoặc HF002.
Định dạng hiển thị nâng cao
Dùng mẫu ##key##
Hiển thị nhiều trường trong nhãn:
search-api('POST', 'https://api.example.com/search', '{"q": "%__input__%"}', 'id', '##name## (##district##)', '$.data', 'res')
Hiển thị như: Nairobi Central Clinic (Nairobi).
Dùng biểu thức @{func}
Áp dụng logic có điều kiện trong nhãn hiển thị:
search-api('POST', 'https://api.example.com/search', '{"q": "%__input__%"}', 'id',
'@{if_else(eq("##status##", "active"), "✓ ##name##", "✗ ##name##")}',
'$.data', 'res')
Kết quả hoạt động hiển thị ✓ Tên cơ sở; không hoạt động hiển thị ✗ Tên cơ sở.
Đặt giá trị mặc định: search-default-api()
Dùng search-default-api() sau search-api() để điền sẵn trường với lựa chọn mặc định được tải từ một lần gọi API riêng (ví dụ: khi chỉnh sửa bản ghi có sẵn):
appearance: search-api(...) search-default-api('POST', 'https://api.example.com/get', '{"id": "##saved_id##"}', 'id', 'name', '$.item')
Ký tự phân cách tùy chỉnh cho select_multiple: search-default-separator()
Với trường select_multiple, chỉ định cách ghép nhiều giá trị đã chọn trong chuỗi được lưu:
appearance: search-api(...) search-default-separator(' || ')
Ký tự phân cách mặc định là dấu cách.
Các loại câu hỏi được hỗ trợ
| Loại câu hỏi | Trường hợp sử dụng |
|---|---|
select_one | Chọn một từ kết quả tìm kiếm |
select_multiple | Chọn nhiều từ kết quả tìm kiếm |
text | Tự động hoàn thành — người điều tra gõ tự do nhưng có thể chọn gợi ý |
Dùng dữ liệu phản hồi đã lưu
save_path lưu đối tượng phản hồi API đầy đủ dưới tên đã cho. Các trường khác có thể tham chiếu bằng pulldata():
| type | name | label | calculation |
|---|---|---|---|
| select_one | facility | Chọn cơ sở | search-api(..., 'facility_data') |
| calculate | facility_district | pulldata('facility_data', 'district') | |
| calculate | facility_type | pulldata('facility_data', 'type') |
Thực hành tốt
- Đảm bảo endpoint API phản hồi trong 1–2 giây — API chậm làm cho tìm kiếm có cảm giác không phản hồi.
- Dùng
%__input__%trongpost_bodyđể API chỉ trả về kết quả khớp, không phải toàn bộ tập dữ liệu. - Lập chỉ mục trường tìm kiếm phía server (ví dụ: Elasticsearch, full-text index cơ sở dữ liệu) để phản hồi nhanh.
- Giới hạn kết quả ở 20–50 mục mỗi truy vấn — trả về hàng nghìn kết quả làm mất ý nghĩa của tìm kiếm.
- Thêm yêu cầu độ dài input tối thiểu trong API để tránh kích hoạt truy vấn rộng khi nhập một ký tự.
Giới hạn
- Dynamic Search yêu cầu kết nối mạng — không hoạt động ngoại tuyến.
- Placeholder
%__input__%được đưa vào nguyên văn; hãy làm sạch input phía server để ngăn tấn công injection. - Các biểu thức hiển thị
@{func}phức tạp có thể được hỗ trợ hạn chế trên các phiên bản client rtSurvey.