несколько слов действуют как одно слово в поиске - Elasticsearch - PullRequest
0 голосов
/ 06 января 2019

У меня проблема с такими тегами, как social media, two words, tag with many spaces имеют умноженную оценку для каждого слова в поисковом запросе.

Как я могу добиться поиска two words как одного слова, вместо этого получая разные оценки при поиске two и two words

Вот визуальное представление текущей оценки результатов:

+-----------------------+-------+
| search                | score |
+-----------------------+-------+
| two                   | 2.76  |
| two words             | 5.53  |
| tag with many spaces  | 11.05 |
| singleword            | 2.76  |

Вот визуальное представление того, что я хочу:

+-----------------------+-------+
| search                | score |
+-----------------------+-------+
| two                   | 2.76  |
| two words             | 2.76  |
| tag with many spaces  | 2.76  |
| singleword            | 2.76  |

В каждом документе несколько тегов. каждый поиск тега разбивается запятой , в PHP и выводится как запрос ниже

Если в документе есть несколько тегов, включая two words и singleword, это будет поисковый запрос:

"query": {
    "function_score": {
        "query": {
            "bool": {
                "should": [
                    {
                        "match": {
                            "tags.name": "two words"
                        }
                    },
                    {
                        "match": {
                            "tags.name": "singleword"
                        }
                    }
                ]
            }
        },
        "functions": [
            {
                "field_value_factor": {
                    "field": "tags.votes"
                }
            }
        ],
        "boost_mode": "multiply"
    }
}

Счет будет другим, если искать two вместо two words

Вот как выглядит результат при поиске two words

{
    "_index": "index",
    "_type": "type",
    "_id": "u10q42cCZsbFNf1W0Tdq",
    "_score": 4.708793,
    "_source": {
        "url": "example.com",
        "title": "title of the document",
        "description": "some description of the document",
        "popularity": 9,
        "tags": [
            {
                "name": "two words",
                "votes": 1
            },
            {
                "name": "singleword",
                "votes": 1
            },
            {
                "name": "othertag",
                "votes": 1
            },
            {
                "name": "random",
                "votes": 1
            }
        ]
    }
}

Вот результат при поиске two вместо two words

{
    "_index": "index",
    "_type": "type",
    "_id": "u10q42cCZsbFNf1W0Tdq",
    "_score": 3.4481666,
    "_source": {
        "url": "example.com",
        "title": "title of the document",
        "description": "some description of the document",
        "popularity": 9,
        "tags": [
            {
                "name": "two words",
                "votes": 1
            },
            {
                "name": "singleword",
                "votes": 1
            },
            {
                "name": "othertag",
                "votes": 1
            },
            {
                "name": "random",
                "votes": 1
            }
        ]
    }
}

Вот отображение (специально для тегов)

"tags": {
  "type": "nested",
  "include_in_parent": true,
  "properties": {
    "name": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword",
          "ignore_above": 256
        }
      }
    },
    "votes": {
      "type": "long"
    }
  }
}

Я пробовал искать с "\"two words\"" и "*two words*", но это не дало никакой разницы.

Можно ли этого добиться?

1 Ответ

0 голосов
/ 07 января 2019

Вы должны использовать не проанализированную строку для вашего соответствия и переключиться на запрос термина.

Можете ли вы попробовать:

"query": {
    "function_score": {
        "query": {
            "bool": {
                "should": [
                    {
                        "term": {
                            "tags.name.keyword": "two words"
                        }
                    },
                    {
                        "term": {
                            "tags.name.keyword": "singleword"
                        }
                    }
                ]
            }
        },
        "functions": [
            {
                "field_value_factor": {
                    "field": "tags.votes"
                }
            }
        ],
        "boost_mode": "multiply"
    }
}

В вашей реальной реализации, когда вы выполняете запрос match с запросом «два слова», он анализирует ваш запрос для поиска токенов «два» и «слова» в ваших тегах. Таким образом, документы с тегом «два слова» будут соответствовать двум токенам и будут увеличены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...