diff --git a/src/Plugin/search_api/backend/SearchApiSolrBackend.php b/src/Plugin/search_api/backend/SearchApiSolrBackend.php index f8a4f99..27be2a3 100644 --- a/src/Plugin/search_api/backend/SearchApiSolrBackend.php +++ b/src/Plugin/search_api/backend/SearchApiSolrBackend.php @@ -2742,6 +2742,7 @@ class SearchApiSolrBackend extends BackendPluginBase implements SolrBackendInter // @see https://www.drupal.org/project/search_api/issues/2991134 case 'terms': case 'phrase': + case 'sloppy_phrase': case 'edismax': if (is_array($value)) { $keys += $value; diff --git a/src/Plugin/search_api/parse_mode/SloppyPhrase.php b/src/Plugin/search_api/parse_mode/SloppyPhrase.php new file mode 100644 index 0000000..c2df186 --- /dev/null +++ b/src/Plugin/search_api/parse_mode/SloppyPhrase.php @@ -0,0 +1,18 @@ +escapePhrase(trim($key)); @@ -744,6 +753,10 @@ class Utility { $query_parts[] = $pre . implode(' ' . $pre, $k); break; + case "sloppy_phrase": + $sloppiness = '~10000000'; + // No break! Execute 'default', too. + case "terms": if (count($k) > 1 && count($fields) > 0) { $key_parts = []; @@ -751,37 +764,38 @@ class Utility { $field_parts = []; foreach ($fields as $f) { $field = $f; - $boost_or_fuzzy = ''; + $boost = ''; // Split on operators: // - boost (^), // - fixed score (^=), // - fuzzy/term proximity (~). - if ($split = preg_split('/([\^~])/', $f, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)) { + if ($split = preg_split('/([\^])/', $f, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)) { $field = array_shift($split); - $boost_or_fuzzy = implode('', $split); + $boost = implode('', $split); } - $field_parts[] = $field . ':' . $l . $boost_or_fuzzy; + $field_parts[] = $field . ':' . $l . $boost; } $key_parts[] = $pre . '(' . implode(' ', $field_parts) . ')'; } $query_parts[] = '(' . implode(' ', $key_parts) . ')'; } - // No break! Execute 'default', too. + // No break! Execute 'default', too. + default: if (count($fields) > 0) { foreach ($fields as $f) { $field = $f; - $boost_or_fuzzy = ''; + $boost = ''; // Split on operators for boost (^), fixed score (^=), fuzzy/term proximity (~). - if ($split = preg_split('/([\^~])/', $f, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)) { + if ($split = preg_split('/([\^])/', $f, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)) { $field = array_shift($split); - $boost_or_fuzzy = implode('', $split); + $boost = implode('', $split); } - $query_parts[] = $field . ':(' . $pre . implode(' ' . $pre, $k) . ')' . $boost_or_fuzzy; + $query_parts[] = $field . ':(' . $pre . implode(' ' . $pre, $k) . $sloppiness . ')' . $boost; } } else { - $query_parts[] = '(' . $pre . implode(' ' . $pre, $k) . ')'; + $query_parts[] = '(' . $pre . implode(' ' . $pre, $k) . $sloppiness .')'; } } } diff --git a/tests/src/Kernel/SearchApiSolrTest.php b/tests/src/Kernel/SearchApiSolrTest.php index e8571ef..cd1056b 100644 --- a/tests/src/Kernel/SearchApiSolrTest.php +++ b/tests/src/Kernel/SearchApiSolrTest.php @@ -249,6 +249,13 @@ class SearchApiSolrTest extends SolrBackendTestBase { ); $this->assertEquals('(+"foo" +"apple pie" +"bar")', $flat); + $flat = SolrUtility::flattenKeys( + $query->getKeys(), + [], + 'sloppy_phrase' + ); + $this->assertEquals('(+"foo"~10000000 +"apple pie"~10000000 +"bar"~10000000)', $flat); + $flat = SolrUtility::flattenKeys( $query->getKeys(), [],