从数据库中的文本中查找包含单词的句子

Find a sentence that contains a word in text from database

我想用一个例子来解释我想要完成的事情。假设我的 posts table.

中有两行
It snows a lot in winter in Norway. While it barely snows where I live.

I run four miles every morning. I am trying to get fit.

当我搜索in winter时,我想得到句子It snows a lot in winter in Norway.

我知道我可以通过以下方式获得这一行:

$posts = \App\Models\Post::where('body', 'like', "%{in winter}%")->get();

但我不确定如何得到准确的句子。

虽然在技术上可能使用 SQL 来获取准确的句子,但您最好使用 PHP 从集合中获取准确的句子。

我创建了一个使用集合的示例(因为您正在使用 Laravel),从您提供的 Post 查询开始(尽管我确实从 like 字符串中删除了大括号)。

1.获取正文为搜索查询的帖子集合

$posts = Post::where('body', 'like', "%in winter%")->get();

2。将帖子集合映射到单个句子。展平以删除空句子。

$postSentences = $posts->map( function($post) {
   // preg split makes sure the text is splitted on . or ! or ?
   return preg_split('/\.|\?|!/', $post->body); 
})->flatten();

3。使用过滤器和 Str::contains()

获取相应的句子
$matchingSentences = $postSentences->filter( function($sentence) {
    return Str::contains($sentence, 'in winter');
});

$matchingSentences 应该 return:

Illuminate\Support\Collection 
    all: [
       "It snows a lot in winter in Norway",
    ],
}

示例可能会根据您的需要进行更改/缩​​短。但这应该可以解决上述问题。