Python客户端 #
安装 #
bash
pip install algoliasearch
初始化 #
基本初始化 #
python
from algoliasearch.search_client import SearchClient
client = SearchClient.create('APP_ID', 'API_KEY')
index = client.init_index('products')
环境变量配置 #
python
import os
from algoliasearch.search_client import SearchClient
client = SearchClient.create(
os.environ.get('ALGOLIA_APP_ID'),
os.environ.get('ALGOLIA_API_KEY')
)
搜索操作 #
基本搜索 #
python
results = index.search('iphone')
print(f"找到 {results['nbHits']} 条结果")
for hit in results['hits']:
print(hit['name'])
带参数搜索 #
python
results = index.search('iphone', {
'hitsPerPage': 20,
'page': 0,
'filters': 'brand:Apple',
'facets': ['brand', 'category'],
'attributesToHighlight': ['name', 'description']
})
搜索结果处理 #
python
def process_results(results):
return {
'items': [
{
'id': hit['objectID'],
'name': hit.get('_highlightResult', {}).get('name', {}).get('value', hit['name']),
'price': hit['price']
}
for hit in results['hits']
],
'total': results['nbHits'],
'page': results['page'],
'total_pages': results['nbPages']
}
索引操作 #
添加记录 #
python
# 添加单条记录
index.save_object({
'objectID': 'prod-001',
'name': 'iPhone 15 Pro',
'price': 999
})
# 批量添加
index.save_objects([
{'objectID': 'prod-001', 'name': 'Product 1'},
{'objectID': 'prod-002', 'name': 'Product 2'}
])
更新记录 #
python
# 完全替换
index.save_object({
'objectID': 'prod-001',
'name': 'Updated Name',
'price': 899
})
# 部分更新
index.partial_update_object({
'objectID': 'prod-001',
'price': 899
})
删除记录 #
python
# 删除单条
index.delete_object('prod-001')
# 批量删除
index.delete_objects(['prod-001', 'prod-002'])
# 按条件删除
index.delete_by({'filters': 'stock:0'})
# 清空索引
index.clear_objects()
批量操作 #
python
index.batch({
'requests': [
{'action': 'addObject', 'body': {'name': 'Product 1'}},
{'action': 'updateObject', 'body': {'objectID': '1', 'name': 'Updated'}},
{'action': 'deleteObject', 'objectID': '2'}
]
})
索引设置 #
获取设置 #
python
settings = index.get_settings()
print(settings)
更新设置 #
python
index.set_settings({
'searchableAttributes': ['name', 'description', 'brand'],
'attributesForFaceting': ['brand', 'category'],
'customRanking': ['desc(rating)'],
'hitsPerPage': 20
})
分面搜索 #
获取分面值 #
python
results = index.search('', {
'facets': ['brand', 'category']
})
print(results['facets'])
搜索分面值 #
python
result = index.search_for_facet_values('brand', 'Ap')
print(result['facetHits'])
同义词操作 #
python
# 添加同义词
index.save_synonym({
'objectID': 'syn-1',
'type': 'synonym',
'synonyms': ['手机', '电话', '移动电话']
})
# 获取同义词
synonym = index.get_synonym('syn-1')
# 删除同义词
index.delete_synonym('syn-1')
规则操作 #
python
# 添加规则
index.save_rule({
'objectID': 'rule-1',
'condition': {'pattern': 'sale', 'anchoring': 'contains'},
'consequence': {
'params': {'filters': 'onSale:true'}
}
})
# 获取规则
rule = index.get_rule('rule-1')
# 删除规则
index.delete_rule('rule-1')
Django集成 #
视图示例 #
python
from django.http import JsonResponse
from django.views import View
from algoliasearch.search_client import SearchClient
client = SearchClient.create('APP_ID', 'SEARCH_KEY')
index = client.init_index('products')
class SearchView(View):
def get(self, request):
query = request.GET.get('q', '')
page = int(request.GET.get('page', 0))
results = index.search(query, {
'page': page,
'hitsPerPage': 20,
'attributesToHighlight': ['name', 'description']
})
return JsonResponse({
'success': True,
'data': results
})
模型同步 #
python
from django.db import models
from algoliasearch.search_client import SearchClient
client = SearchClient.create('APP_ID', 'ADMIN_KEY')
index = client.init_index('products')
class Product(models.Model):
name = models.CharField(max_length=200)
price = models.DecimalField(max_digits=10, decimal_places=2)
brand = models.CharField(max_length=100)
category = models.CharField(max_length=100)
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
self.index_to_algolia()
def delete(self, *args, **kwargs):
index.delete_object(str(self.id))
super().delete(*args, **kwargs)
def index_to_algolia(self):
index.save_object({
'objectID': str(self.id),
'name': self.name,
'price': float(self.price),
'brand': self.brand,
'category': self.category
})
Flask集成 #
python
from flask import Flask, request, jsonify
from algoliasearch.search_client import SearchClient
app = Flask(__name__)
client = SearchClient.create('APP_ID', 'API_KEY')
index = client.init_index('products')
@app.route('/search')
def search():
query = request.args.get('q', '')
page = int(request.args.get('page', 0))
results = index.search(query, {
'page': page,
'hitsPerPage': 20
})
return jsonify({
'success': True,
'data': results
})
@app.route('/index', methods=['POST'])
def index_products():
products = request.json.get('products', [])
index.save_objects(products)
return jsonify({'success': True})
if __name__ == '__main__':
app.run(debug=True)
数据同步 #
数据库同步 #
python
import psycopg2
from algoliasearch.search_client import SearchClient
client = SearchClient.create('APP_ID', 'ADMIN_KEY')
index = client.init_index('products')
def sync_products():
conn = psycopg2.connect(os.environ.get('DATABASE_URL'))
cursor = conn.cursor()
cursor.execute('SELECT id, name, price, brand, category FROM products WHERE active = true')
products = [
{
'objectID': str(row[0]),
'name': row[1],
'price': float(row[2]),
'brand': row[3],
'category': row[4]
}
for row in cursor.fetchall()
]
index.save_objects(products)
cursor.close()
conn.close()
print(f'Synced {len(products)} products')
错误处理 #
python
from algoliasearch.exceptions import AlgoliaException
try:
results = index.search('iphone')
except AlgoliaException as e:
print(f'Algolia error: {e}')
完整示例 #
python
import os
from flask import Flask, request, jsonify
from algoliasearch.search_client import SearchClient
from algoliasearch.exceptions import AlgoliaException
app = Flask(__name__)
client = SearchClient.create(
os.environ.get('ALGOLIA_APP_ID'),
os.environ.get('ALGOLIA_API_KEY')
)
index = client.init_index('products')
@app.route('/api/search', methods=['GET'])
def search():
try:
query = request.args.get('q', '')
page = int(request.args.get('page', 0))
brand = request.args.get('brand')
category = request.args.get('category')
filters = []
if brand:
filters.append(f'brand:{brand}')
if category:
filters.append(f'category:{category}')
results = index.search(query, {
'page': page,
'hitsPerPage': 20,
'filters': ' AND '.join(filters) if filters else None,
'facets': ['brand', 'category'],
'attributesToHighlight': ['name', 'description']
})
return jsonify({
'success': True,
'data': results
})
except AlgoliaException as e:
return jsonify({
'success': False,
'error': str(e)
}), 500
@app.route('/api/index', methods=['POST'])
def index_products():
try:
products = request.json.get('products', [])
index.save_objects(products)
return jsonify({'success': True})
except AlgoliaException as e:
return jsonify({
'success': False,
'error': str(e)
}), 500
if __name__ == '__main__':
app.run(debug=True)
总结 #
Python客户端要点:
| 要点 | 说明 |
|---|---|
| 初始化 | SearchClient.create(APP_ID, API_KEY) |
| 搜索 | index.search(query, params) |
| 索引 | save_objects, delete_objects |
| 设置 | set_settings, get_settings |
| 框架 | Django, Flask集成 |
接下来,让我们学习 索引设计原则。
最后更新:2026-03-28