mirror of
https://github.com/Alexander-D-Karpov/akarpov
synced 2025-02-22 13:00:34 +03:00
updated search
This commit is contained in:
parent
600c903a68
commit
f4ca7db696
|
@ -88,8 +88,12 @@ def get_liked(self, obj):
|
|||
|
||||
@extend_schema_field(ListAlbumSerializer)
|
||||
def get_album(self, obj):
|
||||
if obj.album:
|
||||
return ListAlbumSerializer(Album.objects.cache().get(id=obj.album_id)).data
|
||||
if obj.album_id:
|
||||
try:
|
||||
album = Album.objects.cache().get(id=obj.album_id)
|
||||
return ListAlbumSerializer(album).data
|
||||
except Album.DoesNotExist:
|
||||
return None
|
||||
return None
|
||||
|
||||
@extend_schema_field(ListAuthorSerializer(many=True))
|
||||
|
@ -105,15 +109,16 @@ def get_image(self, obj):
|
|||
img = None
|
||||
if obj.image_cropped:
|
||||
img = obj.image_cropped
|
||||
else:
|
||||
elif obj.album_id:
|
||||
try:
|
||||
album = Album.objects.cache().get(id=obj.album_id)
|
||||
if album.image_cropped:
|
||||
img = album.image_cropped
|
||||
else:
|
||||
authors = Author.objects.cache().filter(
|
||||
Q(songs__id=obj.id) & ~Q(image="")
|
||||
)
|
||||
if authors:
|
||||
except Album.DoesNotExist:
|
||||
pass
|
||||
if not img:
|
||||
authors = Author.objects.cache().filter(Q(songs__id=obj.id) & ~Q(image=""))
|
||||
if authors.exists():
|
||||
img = authors.first().image_cropped
|
||||
if img:
|
||||
return self.context["request"].build_absolute_uri(img.url)
|
||||
|
|
|
@ -48,7 +48,7 @@ class SongDocument(Document):
|
|||
attr="name",
|
||||
fields={
|
||||
"raw": fields.KeywordField(),
|
||||
"exact": fields.KeywordField(normalizer="lowercase"),
|
||||
"exact": fields.KeywordField(normalizer="lowercase_normalizer"),
|
||||
},
|
||||
)
|
||||
name_transliterated = fields.TextField(
|
||||
|
@ -67,6 +67,13 @@ class Index:
|
|||
settings = {
|
||||
"number_of_shards": 1,
|
||||
"number_of_replicas": 0,
|
||||
"normalizer": {
|
||||
"lowercase_normalizer": {
|
||||
"type": "custom",
|
||||
"char_filter": [],
|
||||
"filter": ["lowercase"],
|
||||
}
|
||||
},
|
||||
"analysis": {
|
||||
"filter": {
|
||||
"my_transliterator": {
|
||||
|
|
|
@ -8,97 +8,30 @@
|
|||
|
||||
|
||||
def search_song(query):
|
||||
# Split query into potential track and artist parts
|
||||
parts = [part.strip() for part in query.split("-")]
|
||||
track_query = parts[0]
|
||||
artist_query = parts[1] if len(parts) > 1 else None
|
||||
|
||||
search = SongDocument.search()
|
||||
|
||||
# Base queries for track name with high boost
|
||||
should_queries = [
|
||||
ES_Q("match_phrase", name={"query": track_query, "boost": 10}),
|
||||
ES_Q("match", name={"query": track_query, "fuzziness": "AUTO", "boost": 8}),
|
||||
ES_Q("wildcard", name={"value": f"*{track_query.lower()}*", "boost": 6}),
|
||||
ES_Q(
|
||||
"match",
|
||||
name_transliterated={"query": track_query, "fuzziness": "AUTO", "boost": 5},
|
||||
),
|
||||
]
|
||||
|
||||
# Add artist-specific queries if artist part exists
|
||||
if artist_query:
|
||||
should_queries.extend(
|
||||
[
|
||||
ES_Q(
|
||||
"nested",
|
||||
path="authors",
|
||||
query=ES_Q(
|
||||
"match_phrase", name={"query": artist_query, "boost": 4}
|
||||
),
|
||||
),
|
||||
ES_Q(
|
||||
"nested",
|
||||
path="authors",
|
||||
query=ES_Q(
|
||||
"match",
|
||||
name={"query": artist_query, "fuzziness": "AUTO", "boost": 3},
|
||||
),
|
||||
),
|
||||
ES_Q(
|
||||
"nested",
|
||||
path="authors",
|
||||
query=ES_Q(
|
||||
"wildcard",
|
||||
name={"value": f"*{artist_query.lower()}*", "boost": 2},
|
||||
),
|
||||
),
|
||||
]
|
||||
# Build a multi_match query that searches in song name, authors' names, and album names
|
||||
multi_match_query = ES_Q(
|
||||
"multi_match",
|
||||
query=query,
|
||||
fields=[
|
||||
"name^5",
|
||||
"name.raw^10",
|
||||
"name.exact^15",
|
||||
"authors.name^4",
|
||||
"authors.name.raw^8",
|
||||
"authors.name.exact^12",
|
||||
"album.name^3",
|
||||
"album.name.raw^6",
|
||||
"album.name.exact^9",
|
||||
],
|
||||
fuzziness="AUTO",
|
||||
operator="and",
|
||||
type="best_fields",
|
||||
)
|
||||
else:
|
||||
# If no explicit artist, still search in authors but with lower boost
|
||||
should_queries.extend(
|
||||
[
|
||||
ES_Q(
|
||||
"nested",
|
||||
path="authors",
|
||||
query=ES_Q("match_phrase", name={"query": track_query, "boost": 2}),
|
||||
),
|
||||
ES_Q(
|
||||
"nested",
|
||||
path="authors",
|
||||
query=ES_Q(
|
||||
"match",
|
||||
name={"query": track_query, "fuzziness": "AUTO", "boost": 1},
|
||||
),
|
||||
),
|
||||
]
|
||||
)
|
||||
|
||||
# Add album queries with lower boost
|
||||
should_queries.extend(
|
||||
[
|
||||
ES_Q(
|
||||
"nested",
|
||||
path="album",
|
||||
query=ES_Q("match_phrase", name={"query": track_query, "boost": 1.5}),
|
||||
),
|
||||
ES_Q(
|
||||
"nested",
|
||||
path="album",
|
||||
query=ES_Q(
|
||||
"match",
|
||||
name={"query": track_query, "fuzziness": "AUTO", "boost": 1},
|
||||
),
|
||||
),
|
||||
]
|
||||
)
|
||||
|
||||
# Combine all queries with minimum_should_match=1
|
||||
search_query = ES_Q("bool", should=should_queries, minimum_should_match=1)
|
||||
|
||||
# Execute search with size limit
|
||||
search = search.query(search_query).extra(size=20)
|
||||
search = search.query(multi_match_query).extra(size=20)
|
||||
response = search.execute()
|
||||
|
||||
if response.hits:
|
||||
|
|
Loading…
Reference in New Issue
Block a user