Forum

ElasticSearch

piep14 avatar
Publié le 20 juin 2024
Par piep14

Bonjour,

J'ai créé un moteur de recherches avec ElasticSearch. Ci joint le code produit.

Dans mon index Elastic Search, j'ai 2 pois : C La Coiffure Astrid Coiffure

J'ai lancé une recherche "Astrid coiffure"

Je voudrais que Astrid coiffure sorte avant C La Coiffure, tu peux m'aider ? Si les 2 mots recherchés sont dans un des résultats, son score devrait avoir un poids plus important.

Merci de votre aide.

1public function searchPois($search, $size = 1000, $from = 0): array
2{
3 $queryParameters['index'] = ['pois'];
4 $queryParameters['body']['size'] = $size;
5 $queryParameters['body']['from'] = $from;
6 $queryParameters['body']['sort']['_score'] = ['order' => 'desc'];
7
8 if (!empty($this->sortEnterpriseElasticScript())) {
9 $queryParameters['body']['query']['function_score'] = $this->sortEnterpriseElasticScript();
10 }
11
12 if ($search->what->exactSearch) {
13 $queryParameters['body']['query']['function_score']['query']['bool']['must'][0]['match_phrase']['name']['query'] = implode(' ', $search->what->tags);
14 } else {
15 if ($search->what->tags) {
16 $search->what->tags = $this->removeUnsedWords($search->what->tags);
17
18 if (count($search->what->tags) === 1) {
19 $tag = Tag::query()
20 ->where([
21 'type' => 'poi',
22 'slug' => str($search->what->tags[0])->slug()->value()
23 ])
24 ->first();
25
26 if ($tag) {
27 $term = [
28 'term' => [
29 'tags.id' => $tag->id,
30 ],
31 ];
32
33 $queryParameters['body']['query']['function_score']['query']['bool']['must'][] = $term;
34
35 $search->what->tags[0] = $tag->name;
36 } else {
37 $queryParameters['body']['query']['function_score']['query']['bool']['must'][0]['match']['name']['query'] = implode(' ', $search->what->tags);
38 }
39 } else {
40 $queryParameters['body']['query']['function_score']['query']['bool']['must'][0]['match']['name']['query'] = implode(' ', $search->what->tags);
41 }
42 }
43
44 if ($search->what->category) {
45 $term = [
46 'term' => [
47 'categories.id' => $search->what->category->id,
48 ],
49 ];
50
51 $queryParameters['body']['query']['function_score']['query']['bool']['must'][] = $term;
52 } elseif ($search->what->subcategory) {
53 $term = [
54 'term' => [
55 'subcategories.id' => $search->what->subcategory->id,
56 ],
57 ];
58
59 $queryParameters['body']['query']['function_score']['query']['bool']['must'][] = $term;
60 } elseif ($search->what->firm) {
61 $term = [
62 'term' => [
63 'firm_id' => $search->what->firm->id,
64 ],
65 ];
66
67 $queryParameters['body']['query']['function_score']['query']['bool']['must'][] = $term;
68 }
69
70 if ($search->where->address) {
71 $term = [
72 'term' => [
73 'address_keyword' => $search->where->address,
74 ],
75 ];
76
77 $queryParameters['body']['query']['function_score']['query']['bool']['must'][] = $term;
78 }
79 }
80
81 if ($search->where->metro) {
82 $term = [
83 'term' => [
84 'metros.id' => $search->where->metro->id,
85 ],
86 ];
87
88 $queryParameters['body']['query']['function_score']['query']['bool']['must'][] = $term;
89 } elseif ($search->where->listOfAroundCities->isNotEmpty()) {
90 $terms = [
91 'terms' => [
92 'city.id' => $search->where->listOfAroundCities->pluck('id')->toArray(),
93 ],
94 ];
95
96 $queryParameters['body']['query']['function_score']['query']['bool']['must'][] = $terms;
97 } elseif ($search->where->city) {
98 $term = [
99 'term' => [
100 'city.id' => $search->where->city->id,
101 ],
102 ];
103
104 $queryParameters['body']['query']['function_score']['query']['bool']['must'][] = $term;
105 } elseif ($search->where->department) {
106 $term = [
107 'term' => [
108 'department.id' => $search->where->department->id,
109 ],
110 ];
111
112 $queryParameters['body']['query']['function_score']['query']['bool']['must'][] = $term;
113 }
114
115 if ($search->withPromotion) {
116 $queryParameters['body']['query']['function_score']['query']['bool']['must'][] = [
117 'exists' => [
118 'field' => 'promotion'
119 ]
120 ];
121 }
122
123 if ($search->atHome) {
124 $queryParameters['body']['query']['function_score']['query']['bool']['must'][] = [
125 'term' => [
126 'at_home' => true
127 ]
128 ];
129 }
130
131 return $this
132 ->client
133 ->search($queryParameters)
134 ->asArray();
135}
136
137private function sortEnterpriseElasticScript(): array
138{
139 $painlessScript = "
140 double score = 0;
141 double note = doc.containsKey('average') && !doc['average'].empty ? doc['average'].value : 0;
142 double numberOfNotes = doc.containsKey('number_of_notes') && !doc['number_of_notes'].empty ? doc['number_of_notes'].value : 0;
143 double reduceScore = 1;
144 double coefficientIfIsSelected = doc.containsKey('selected') && doc['selected'].value ? 50 : 0;
145 if (note <= 3.5) { reduceScore = 10; }
146 double increaseScore = (numberOfNotes >= 5 && note >= 4) ? 5 : 1;
147 score = ((numberOfNotes / params.numberOfReviews) / reduceScore + (note * increaseScore / params.numberOfNotes) * params.multiplyingFactor) + coefficientIfIsSelected;
148 return score;
149 ";
150
151 return [
152 'script_score' => [
153 'script' => [
154 'lang' => 'painless',
155 'source' => $painlessScript,
156 'params' => [
157 'numberOfReviews' => 1, // ??
158 'numberOfNotes' => 1, // ??
159 'multiplyingFactor' => 2,
160 ],
161 ],
162 ],
163 ];
164}
Aucune réponse