from django.contrib.postgres.search import SearchVector, SearchQuery, SearchRank, TrigramSimilarity
def post_search(request):
form = SearchForm()
if 'query' in request.GET.keys():
form = SearchForm(request.GET)
if form.is_valid():
cleaned_data = form.cleaned_data
query = cleaned_data['query']
search_vector = SearchVector('title', weight='A') + SearchVector('body', weight='B')
search_query = SearchQuery(query)
posts = Post.published.annotate(
similarity=TrigramSimilarity(
'title', query
)
).filter(similarity__gt=0.1).annotate(
rank=SearchRank(search_vector, search_query)
).filter(rank__gte=0.3).order_by('-rank')
return render(
request, template_name='blog/post_search.html',
context={'posts': posts, 'form': form}
)
return render(request, template_name='blog/post_search.html', context={'form': form})
سلام
کدی که نوشتم مربوط به سرچ داخل دیتابیس با استفاده از full text search با استفاده از postgresql است
مشکلی که من دارم اینه که
annotate(
similarity=TrigramSimilarity(
'title', query
).filter(similarity__gt=0.1)
این قسمت از کد فقط مواردی رو از دیتابیس بر میگردونه که title پستها با مقدار query برابر یا مشابه query باشن
annotate(
rank=SearchRank(search_vector, search_query)
).filter(rank__gte=0.3).order_by('-rank')
و این قسمت کد فقط مواردی رو از دیتابیس بر میگردنه که مقدار search_vector دقیقا برابر با search_query باشه(و مقادیری که واکشی میشن از دیتابیس رتبه بندی هم میکنه بر اساس تعداد تکرار search_query در search_vector)
زمانی که این دو قسمت با هم ترکیب میشن ما باید حتما دقیق سرچ کنیم وگرنه مقداری رو بر نمیگردونه
از نظر خودم مشکل بر میگرده به قسمت دوم کد چون باید مقدار search_query رو دقیق وارد کنیم
ولی ما تو قسمت اول کد از روی مقدار query مقدار search_query رو ساختیم
میخواستم ببینم آیا راه حلی هست که دقیق سرچ نکنیم بتونیم موارد مشابه رو از دیتابیس واکشی کنیم و رتبه بندی هم بکنیم ؟
خیلی بد توضیح دادم امیدوارم که منظورم رو رسونده باشم
ممنون میشم راهنمایی کنید