doc-exports/docs/dws/dev/dws_06_0099.html
Lu, Huayi a24ca60074 DWS DEVELOPER 811 version
Reviewed-by: Hasko, Vladimir <vladimir.hasko@t-systems.com>
Co-authored-by: Lu, Huayi <luhuayi@huawei.com>
Co-committed-by: Lu, Huayi <luhuayi@huawei.com>
2023-01-19 13:37:49 +00:00

86 lines
12 KiB
HTML

<a name="EN-US_TOPIC_0000001098671174"></a><a name="EN-US_TOPIC_0000001098671174"></a>
<h1 class="topictitle1">Rewriting Queries</h1>
<div id="body8662426"><p id="EN-US_TOPIC_0000001098671174__a2d58f291a5104e328a9eb440a07b6478">The <strong id="EN-US_TOPIC_0000001098671174__b842352706104855">ts_rewrite</strong> family of functions searches a given <strong id="EN-US_TOPIC_0000001098671174__b842352706104852">tsquery</strong> for occurrences of a target subquery, and replace each occurrence with a substitute subquery. In essence this operation is a <strong id="EN-US_TOPIC_0000001098671174__b842352706104918">tsquery</strong> specific version of substring replacement. A target and substitute combination can be thought of as a query rewrite rule. A collection of such rewrite rules can be a powerful search aid. For example, you can expand the search using synonyms (that is, new york, big apple, nyc, gotham) or narrow the search to direct the user to some hot topic. </p>
<ul id="EN-US_TOPIC_0000001098671174__u6314631d14d346df8e0c9f515ad8c935"><li id="EN-US_TOPIC_0000001098671174__l9d14310a86dd405195611e7f6096e729">ts_rewrite (query tsquery, target tsquery, substitute tsquery) returns tsquery<p id="EN-US_TOPIC_0000001098671174__a424b268007ed4b00ae99d28d89a7c1e0"><a name="EN-US_TOPIC_0000001098671174__l9d14310a86dd405195611e7f6096e729"></a><a name="l9d14310a86dd405195611e7f6096e729"></a>This form of <strong id="EN-US_TOPIC_0000001098671174__b84235270610511">ts_rewrite</strong> simply applies a single rewrite rule: <strong id="EN-US_TOPIC_0000001098671174__b84235270610514">target</strong> is replaced by <strong id="EN-US_TOPIC_0000001098671174__b842352706105118">substitute</strong> wherever it appears in query. For example:</p>
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001098671174__scd04fb55f9a64ff2803cd88ac7e0c960"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">SELECT</span><span class="w"> </span><span class="n">ts_rewrite</span><span class="p">(</span><span class="s1">'a &amp; b'</span><span class="p">::</span><span class="n">tsquery</span><span class="p">,</span><span class="w"> </span><span class="s1">'a'</span><span class="p">::</span><span class="n">tsquery</span><span class="p">,</span><span class="w"> </span><span class="s1">'c'</span><span class="p">::</span><span class="n">tsquery</span><span class="p">);</span><span class="w"></span>
<span class="w"> </span><span class="n">ts_rewrite</span><span class="w"></span>
<span class="c1">------------</span>
<span class="w"> </span><span class="s1">'b'</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="s1">'c'</span><span class="w"></span>
</pre></div></td></tr></table></div>
</div>
</li><li id="EN-US_TOPIC_0000001098671174__leadf3229407249feadacd55dfd511b27">ts_rewrite (query tsquery, select text) returns tsquery<p id="EN-US_TOPIC_0000001098671174__a64833ee36e024ef5a51f20bde80aee81"><a name="EN-US_TOPIC_0000001098671174__leadf3229407249feadacd55dfd511b27"></a><a name="leadf3229407249feadacd55dfd511b27"></a>This form of <strong id="EN-US_TOPIC_0000001098671174__b842352706105240">ts_rewrite</strong> accepts a starting query and a SQL select command, which is given as a text string. The <strong id="EN-US_TOPIC_0000001098671174__b842352706105237">select</strong> must yield two columns of <strong id="EN-US_TOPIC_0000001098671174__b842352706105235">tsquery</strong> type. For each row of the select result, occurrences of the first column value (the target) are replaced by the second column value (the substitute) within the current <strong id="EN-US_TOPIC_0000001098671174__b842352706105318">query</strong> value.</p>
<div class="note" id="EN-US_TOPIC_0000001098671174__nc5d4c26e903a4488ae2b9256cfdc0a20"><img src="public_sys-resources/note_3.0-en-us.png"><span class="notetitle"> </span><div class="notebody"><p id="EN-US_TOPIC_0000001098671174__ac76a45eb4e5f4f2a8e78a27924172712">Note that when multiple rewrite rules are applied in this way, the order of application can be important; so in practice you will want the source query to <strong id="EN-US_TOPIC_0000001098671174__b84235270610540">ORDER BY</strong> some ordering key.</p>
</div></div>
<p id="EN-US_TOPIC_0000001098671174__afe09e371507147d29c2a8711c0529cee">Consider a real-life astronomical example. We will expand query supernovae using table-driven rewriting rules:</p>
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001098671174__sc2d2fce2c7a043a991fce06b540fef4a"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span>
<span class="normal">6</span>
<span class="normal">7</span>
<span class="normal">8</span>
<span class="normal">9</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">tsearch</span><span class="p">.</span><span class="n">aliases</span><span class="w"> </span><span class="p">(</span><span class="n">id</span><span class="w"> </span><span class="nb">int</span><span class="p">,</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="n">tsquery</span><span class="p">,</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">tsquery</span><span class="p">);</span><span class="w"></span>
<span class="k">INSERT</span><span class="w"> </span><span class="k">INTO</span><span class="w"> </span><span class="n">tsearch</span><span class="p">.</span><span class="n">aliases</span><span class="w"> </span><span class="k">VALUES</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">to_tsquery</span><span class="p">(</span><span class="s1">'supernovae'</span><span class="p">),</span><span class="w"> </span><span class="n">to_tsquery</span><span class="p">(</span><span class="s1">'supernovae|sn'</span><span class="p">));</span><span class="w"></span>
<span class="k">SELECT</span><span class="w"> </span><span class="n">ts_rewrite</span><span class="p">(</span><span class="n">to_tsquery</span><span class="p">(</span><span class="s1">'supernovae &amp; crab'</span><span class="p">),</span><span class="w"> </span><span class="s1">'SELECT t, s FROM tsearch.aliases'</span><span class="p">);</span><span class="w"></span>
<span class="w"> </span><span class="n">ts_rewrite</span><span class="w"> </span>
<span class="c1">---------------------------------</span>
<span class="w"> </span><span class="s1">'crab'</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="s1">'supernova'</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="s1">'sn'</span><span class="w"> </span><span class="p">)</span><span class="w"></span>
</pre></div></td></tr></table></div>
</div>
<p id="EN-US_TOPIC_0000001098671174__a43fedf3aa1b24881a6612670e0382172">We can change the rewriting rules just by updating the table:</p>
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001098671174__sd5d0ee936b4043e0b1d5fc67aef847c4"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span>
<span class="normal">6</span>
<span class="normal">7</span>
<span class="normal">8</span>
<span class="normal">9</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">UPDATE</span><span class="w"> </span><span class="n">tsearch</span><span class="p">.</span><span class="n">aliases</span><span class="w"></span>
<span class="k">SET</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">to_tsquery</span><span class="p">(</span><span class="s1">'supernovae|sn &amp; !nebulae'</span><span class="p">)</span><span class="w"></span>
<span class="k">WHERE</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">to_tsquery</span><span class="p">(</span><span class="s1">'supernovae'</span><span class="p">);</span><span class="w"></span>
<span class="k">SELECT</span><span class="w"> </span><span class="n">ts_rewrite</span><span class="p">(</span><span class="n">to_tsquery</span><span class="p">(</span><span class="s1">'supernovae &amp; crab'</span><span class="p">),</span><span class="w"> </span><span class="s1">'SELECT t, s FROM tsearch.aliases'</span><span class="p">);</span><span class="w"></span>
<span class="w"> </span><span class="n">ts_rewrite</span><span class="w"> </span>
<span class="c1">---------------------------------------------</span>
<span class="w"> </span><span class="s1">'crab'</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="s1">'supernova'</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="s1">'sn'</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="o">!</span><span class="s1">'nebula'</span><span class="w"> </span><span class="p">)</span><span class="w"></span>
</pre></div></td></tr></table></div>
</div>
<p id="EN-US_TOPIC_0000001098671174__af3a3f2b98bd24c08bf3b6e1e8b8cad6e">Rewriting can be slow when there are many rewriting rules, since it checks every rule for a possible match. To filter out obvious non-candidate rules we can use the containment operators for the <strong id="EN-US_TOPIC_0000001098671174__b842352706105731">tsquery</strong> type. In the example below, we select only those rules which might match the original query:</p>
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001098671174__sbf31773d9ee44f9daac468e7190f8d3d"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span>
<span class="normal">6</span>
<span class="normal">7</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">SELECT</span><span class="w"> </span><span class="n">ts_rewrite</span><span class="p">(</span><span class="s1">'a &amp; b'</span><span class="p">::</span><span class="n">tsquery</span><span class="p">,</span><span class="w"> </span><span class="s1">'SELECT t,s FROM tsearch.aliases WHERE ''a &amp; b''::tsquery @&gt; t'</span><span class="p">);</span><span class="w"></span>
<span class="w"> </span><span class="n">ts_rewrite</span><span class="w"> </span>
<span class="c1">------------</span>
<span class="w"> </span><span class="s1">'b'</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="s1">'a'</span><span class="w"></span>
<span class="p">(</span><span class="mi">1</span><span class="w"> </span><span class="k">row</span><span class="p">)</span><span class="w"></span>
<span class="k">DROP</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">ts_rewrite</span><span class="p">;</span><span class="w"></span>
</pre></div></td></tr></table></div>
</div>
</li></ul>
</div>
<div>
<div class="familylinks">
<div class="parentlink"><strong>Parent topic:</strong> <a href="dws_06_0096.html">Additional Features</a></div>
</div>
</div>