2012-05-10 23 views
6

Tôi có một mô hình như thế này:Django đống cỏ khô, ưu tiên cho một số lĩnh vực trong tìm kiếm

class MyModel(models.Model): 
    desc1 = models.TextField(blank=True, default="") 
    desc2 = models.TextField(blank=True, default="") 

Tôi muốn tìm kiếm chuỗi trên các lĩnh vực của mô hình này. Giả sử các trường hợp này của MyModel:

1: desc1="ABc?", desc2="asdasd you" 
2: desc1="Hello, How are you?", desc2="Thank you!" 
3: desc1="ABc?", desc2="ajdf" 

khi tôi tìm kiếm "bạn", nó sẽ hiển thị cho tôi, lần đầu tiên và thứ hai. cuối cùng tôi cần phải hiển thị kết quả có "bạn" trong desc1 cao hơn những người khác. ví dụ, trong mẫu này, mẫu thứ hai nên cao hơn mẫu thứ nhất.

Tôi đã sử dụng, haystack cho tìm kiếm và tạo mẫu cho việc này. nhưng tôi không thể giải quyết vấn đề ưu tiên.

Trả lời

2

Khi bạn nói 'ưu tiên', bạn thực sự có nghĩa là 'sắp xếp', trong phạm vi tìm kiếm.

Django Haystack có thể sắp xếp theo kết quả khớp trường, nhưng nó có thể sắp xếp theo 'điểm', nơi nó sử dụng thuật toán để xác định thứ tự sắp xếp. Bạn có thể ảnh hưởng đến trọng số của điểm số bằng 'Tăng cường số điểm' - xem http://django-haystack.readthedocs.org/en/latest/boost.html

Ngoài ra, bạn nên cân nhắc thêm các trường bổ sung trong search_indexes.py sẽ chỉ để tăng trọng số. Bạn không cần phải có một ánh xạ một-một giữa các trường mô hình Django và chỉ mục. Một cái gì đó như

class MyModelIndex(QueuedSearchIndex): 
    desc1 = indexes.CharField() 
    desc2 = indexes.CharField() 
    otherWeightedField = indexes.CharField() 

    def prepare_otherWeightedField(self,obj) 
     # fill the extra field with extra stuff to help you sort, based on processing values from other fields 
+0

API "tăng cường" xuất hiện rất không ổn định. Các tài liệu bạn liên kết để hiển thị một cách tiếp cận hoàn toàn khác nhau ... mà thậm chí không làm việc với các mã hiện tại ... – Cerin

+0

Chỉ cần được rõ ràng, đây là một ví dụ được viết cho Haystack 1,2 –

1

Tôi sử dụng phương pháp này.

from types import ListType 
from haystack import indexes 


class DocumentField(indexes.SearchField): 
    """An index field that combines and weights other fields because Haystack 
    does not provide for weighted searching. This field makes use of other 
    existing field classes for DRY.""" 

    def __init__(self, *args, **kwargs): 
     self.fields = kwargs.pop("fields", None) 
     super(DocumentField, self).__init__(*args, **kwargs) 
     self.document = True 
     self.use_template = False 

    def prepare(self, obj): 
     values = [] 

     for field_instance in self.fields.values(): 
      v = field_instance.prepare(obj) 
      if not v: 
       continue 
      if not isinstance(v, ListType): 
       v = [v] 
      # Apply boost 
      v = v * int(field_instance.boost * 10) 
      values.extend(v) 

     return "\n".join(values) 


class MyModelIndex(indexes.SearchIndex, indexes.Indexable): 
    text = DocumentField(fields=dict(
     desc1 = indexes.CharField(model_attr="desc1", boost=1.0), 
     desc2 = indexes.CharField(model_attr="desc2", boost=0.7) 
    )) 

    def get_model(self): 
     return MyModel 
+0

đó là đáng ngạc nhiên rằng không ai đang cố gắng thực hiện điều này. Tôi cho rằng điều này sẽ vẫn không được áp dụng nếu chúng ta muốn kết hợp EdgeNgramField và CharField? Tôi đang nghĩ về việc sửa đổi queryset để truy vấn mặc định được tìm kiếm trên các trường khác nhau – Forethinker

Các vấn đề liên quan