我正在尝试为一个小型网站构建一个简单的搜索引擎。我最初的想法是避免使用较大的软件包,例如 Solr、Haystack 等,因为我的搜索需求过于简单。
我希望通过一些指导,我可以使我的代码更 Pythonic、更高效,最重要的是可以正常运行。
预期功能:根据 item_number、产品名称或类别名称的全部或部分匹配返回产品结果(目前没有实现类别匹配)
一些代码:
import pymssql
import utils #My utilities
class Product(object):
def __init__(self, item_number, name, description, category, msds):
self.item_number = str(item_number).strip()
self.name = name
self.description = description
self.category = category
self.msds = str(msds).strip()
class Category(object):
def __init__(self, name, categories):
self.name = name
self.categories = categories
self.slug = utils.slugify(name)
self.products = []
categories = (
Category('Food', ('123', '12A')),
Category('Tables', ('354', '35A', '310', '31G')),
Category('Chemicals', ('845', '85A', '404', '325'))
)
products = []
conn = pymssql.connect(...)
curr = conn.cursor()
for Category in categories:
for c in Category.categories:
curr.execute('SELECT item_number, name, CAST(description as text), category, msds from tblProducts WHERE category=%s', c)
for row in curr:
product = Product(row[0], row[1], row[2], row[3], row[4])
products.append(product)
Category.products.append(product)
conn.close()
def product_search(*params):
results = []
for product in products:
for param in params:
name = str(product.name)
if (name.find(param.capitalize())) != -1:
results.append(product)
item_number = str(product.item_number)
if (item.number.find(param.upper())) != -1:
results.append(product)
print results
product_search('something')
带有我无法更改的表和字段的 MS SQL 数据库。
最多我会拉大约200个产品。
有些事情让我很兴奋。嵌套 for 循环。产品搜索中有两个不同的 if 语句,这可能会导致将重复的产品添加到结果中。
我的想法是,如果我在内存中有产品(产品很少会改变),我可以缓存它们,减少对数据库的依赖,并可能提供有效的搜索。
...暂时发布...将回来并添加更多想法
编辑:我有一个包含产品列表的类别对象的原因是我想显示按类别组织的产品的 html 页面。此外,实际的类别编号将来可能会发生变化,并且持有一个元组似乎是简单的无痛解决方案。那和我对数据库具有只读访问权限。
单独列出产品列表的原因有点作弊。我有一个页面显示所有能够查看 MSDS(安全表)的产品。它还提供了一个在搜索时遍历的更少级别。
编辑2:
def product_search(*params):
results = []
lowerParams = [ param.lower() for param in params ]
for product in products:
item_number = (str(product.item_number)).lower()
name = (str(product.name)).lower()
for param in lowerParams:
if param in item_number or param in name:
results.append(product)
print results