Let's all try to summarize changes to the wiki as we would changes to
the code - without that it's tough to tell what the changes are.

In this particular case, I'm not sure if all of the formatting changes
were deliberate or accidental.  If accidental, I wonder if the cause
was a bug in GUI mode, or a bug in your browser?

-Yonik
http://www.lucidimagination.com



On Sat, Nov 14, 2009 at 9:05 AM, Apache Wiki <wikidi...@apache.org> wrote:
> Dear Wiki user,
>
> You have subscribed to a wiki page or wiki category on "Solr Wiki" for change 
> notification.
>
> The "FunctionQuery" page has been changed by GrantIngersoll.
> http://wiki.apache.org/solr/FunctionQuery?action=diff&rev1=29&rev2=30
>
> --------------------------------------------------
>
> - FunctionQuery allows one to use the actual value of a numeric field and 
> functions of those fields in a relevancy score.
> + FunctionQuery allows one to use the actual value of a numeric field and 
> functions of those fields in a relevancy score.
>
>  <<TableOfContents>>
>
>  = Using FunctionQuery =
>  There are a few ways to use FunctionQuery from Solr's HTTP interface:
> +
>   1. Embed a FunctionQuery in a regular query expressed in SolrQuerySyntax 
> via the _val_ hook
>   1. Use the FunctionQParserPlugin, ie: {{{q={!func}log(foo)}}}
>   1. Use a parameter that has an explicit type of FunctionQuery, such as 
> DisMaxRequestHandler's '''bf''' (boost function) parameter.
> -     * NOTE: the '''bf''' parameter actually takes a list of function 
> queries separated by whitespace and each with an optional boost.  Make sure 
> to eliminate any internal whitespace in single function queries when using 
> '''bf'''.
> +   * NOTE: the '''bf''' parameter actually takes a list of function queries 
> separated by whitespace and each with an optional boost.  Make sure to 
> eliminate any internal whitespace in single function queries when using 
> '''bf'''.
> -     * Example: {{{q=foo&bf="ord(popularity)^0.5 
> recip(rord(price),1,1000,1000)^0.3"}}}
> +   * Example: {{{q=foo&bf="ord(popularity)^0.5 
> recip(rord(price),1,1000,1000)^0.3"}}}
>
>  See SolrPlugins#ValueSourceParser for information on how to hook in your own 
> FunctionQuery.
>
> @@ -20, +21 @@
>
>  There is currently no infix parser - functions must be expressed as function 
> calls (e.g. sum(a,b) instead of a+b)
>
>  = Available Functions =
> -
>  == constant ==
> - <!> [[Solr1.3]]
> - Floating point constants.
> + <!> [[Solr1.3]] Floating point constants.
> +
> -     Example Syntax: '''1.5'''
> +  . Example Syntax: '''1.5'''
> -
> -     SolrQuerySyntax Example: '''_val_:1.5'''
> +  SolrQuerySyntax Example: '''_val_:1.5'''
>
>  == fieldvalue ==
>  This function returns the numeric field value of an indexed field with a 
> maximum of one value per document (not multiValued).  The syntax is simply 
> the field name by itself.  0 is returned for documents without a value in the 
> field.
> +
> -     Example Syntax: '''myFloatField'''
> +  . Example Syntax: '''myFloatField'''
> -
> -     SolrQuerySyntax Example: '''_val_:myFloatField'''
> +  SolrQuerySyntax Example: '''_val_:myFloatField'''
>
>  == ord ==
>  ord(myfield) returns the ordinal of the indexed field value within the 
> indexed list of terms for that field in lucene index order (lexicographically 
> ordered by unicode value), starting at 1. In other words, for a given field, 
> all values are ordered lexicographically; this function then returns the 
> offset of a particular value in that ordering. The field must have a maximum 
> of one value per document (not multiValued).  0 is returned for documents 
> without a value in the field.
> +
> -    Example: If there were only three values for a particular field: 
> "apple","banana","pear", then ord("apple")=1, ord("banana")=2, ord("pear")=3
> +  . Example: If there were only three values for a particular field: 
> "apple","banana","pear", then ord("apple")=1, ord("banana")=2, ord("pear")=3
> -
> -    Example Syntax: '''ord(myIndexedField)'''
> +  Example Syntax: '''ord(myIndexedField)'''
> -
> -    Example SolrQuerySyntax: '''_val_:"ord(myIndexedField)"'''
> +  Example SolrQuerySyntax: '''_val_:"ord(myIndexedField)"'''
>
> + WARNING: as of Solr 1.4, ord() and rord() can cause excess memory use since 
> they must use a FieldCache entry at the top level reader, while sorting and 
> function queries now use entries at the segment level.  Hence sorting or 
> using a different function query, in addition to ord()/rord() will double 
> memory use.
> - WARNING: as of Solr 1.4, ord() and rord() can cause excess memory use since 
> they must use a FieldCache entry
> - at the top level reader, while sorting and function queries now use entries 
> at the segment level.  Hence sorting
> - or using a different function query, in addition to ord()/rord() will 
> double memory use.
> -
>
>  WARNING: ord() depends on the position in an index and can thus change when 
> other documents are inserted or deleted, or if a !MultiSearcher is used.
>
>  == rord ==
>  The reverse ordering of what ord provides.
> +
> -     Example Syntax: '''rord(myIndexedField)'''
> +  . Example Syntax: '''rord(myIndexedField)'''
> -
> -     Example: '''rord(myDateField)''' is a metric for how old a document is: 
> the youngest document will return 1, the oldest document will return the 
> total number of documents.
> +  Example: '''rord(myDateField)''' is a metric for how old a document is: 
> the youngest document will return 1, the oldest document will return the 
> total number of documents.
>
> + WARNING: as of Solr 1.4, ord() and rord() can cause excess memory use since 
> they must use a FieldCache entry at the top level reader, while sorting and 
> function queries now use entries at the segment level.  Hence sorting or 
> using a different function query, in addition to ord()/rord() will double 
> memory use.
> -
> - WARNING: as of Solr 1.4, ord() and rord() can cause excess memory use since 
> they must use a FieldCache entry
> - at the top level reader, while sorting and function queries now use entries 
> at the segment level.  Hence sorting
> - or using a different function query, in addition to ord()/rord() will 
> double memory use.
>
>  == sum ==
> - <!> [[Solr1.3]]
> - sum(x,y,...) returns the sum of multiple functions.
> + <!> [[Solr1.3]] sum(x,y,...) returns the sum of multiple functions.
> +
> -     Example Syntax: '''sum(x,1)'''
> +  . Example Syntax: '''sum(x,1)'''
> -
> -     Example Syntax: '''sum(x,y)'''
> +  Example Syntax: '''sum(x,y)'''
> -
> -     Example Syntax: '''sum(sqrt(x),log(y),z,0.5)'''
> +  Example Syntax: '''sum(sqrt(x),log(y),z,0.5)'''
>
>  == sub ==
> - <!> [[Solr1.4]]
> - sub(x,y) returns x-y
> + <!> [[Solr1.4]] sub(x,y) returns x-y
> +
> -     Example: '''sub(myfield,myfield2)'''
> +  . Example: '''sub(myfield,myfield2)'''
> -
> -     Example: '''sub(100,sqrt(myfield))'''
> +  Example: '''sub(100,sqrt(myfield))'''
>
>  == product ==
> - <!> [[Solr1.3]]
> - product(x,y,...) returns the product of multiple functions.
> + <!> [[Solr1.3]] product(x,y,...) returns the product of multiple functions.
> +
> -     Example Syntax: '''product(x,2)'''
> +  . Example Syntax: '''product(x,2)'''
> -
> -     Example Syntax: '''product(x,y)'''
> +  Example Syntax: '''product(x,y)'''
>
>  == div ==
> - <!> [[Solr1.3]]
> - div(x,y) divides the function x by the function y.
> + <!> [[Solr1.3]] div(x,y) divides the function x by the function y.
> +
> -     Example Syntax: '''div(1,x)'''
> +  . Example Syntax: '''div(1,x)'''
> -
> -     Example Syntax: '''div(sum(x,100),max(y,1))'''
> +  Example Syntax: '''div(sum(x,100),max(y,1))'''
>
>  == pow ==
> - <!> [[Solr1.3]]
> - pow(x,y) raises the base x to the power y.
> + <!> [[Solr1.3]] pow(x,y) raises the base x to the power y.
> +
> -     Example Syntax: '''pow(x,0.5)'''   same as sqrt
> +  . Example Syntax: '''pow(x,0.5)'''   same as sqrt
> -
> -     Example Syntax: '''pow(x,log(y))'''
> +  Example Syntax: '''pow(x,log(y))'''
>
>  == abs ==
> - <!> [[Solr1.3]]
> - abs(x) returns the absolute value of a function.
> + <!> [[Solr1.3]] abs(x) returns the absolute value of a function.
> +
> -     Example Syntax: '''abs(-5)'''
> +  . Example Syntax: '''abs(-5)'''
> -
> -     Example Syntax: '''abs(x)'''
> +  Example Syntax: '''abs(x)'''
>
>  == log ==
> - <!> [[Solr1.3]]
> - log(x) returns log base 10 of the function x.
> + <!> [[Solr1.3]] log(x) returns log base 10 of the function x.
> +
> -     Example Syntax: '''log(x)'''
> +  . Example Syntax: '''log(x)'''
> -
> -     Example Syntax: '''log(sum(x,100))'''
> +  Example Syntax: '''log(sum(x,100))'''
>
>  == sqrt ==
> - <!> [[Solr1.3]]
> - sqrt(x) returns the square root of the function x
> + <!> [[Solr1.3]] sqrt(x) returns the square root of the function x
> +
> -     Example Syntax: '''sqrt(2)'''
> +  . Example Syntax: '''sqrt(2)'''
> -
> -     Example Syntax: '''sqrt(sum(x,100))'''
> +  Example Syntax: '''sqrt(sum(x,100))'''
>
>  == map ==
> - <!> [[Solr1.3]]
> - map(x,min,max,target) maps any values of the function x that fall within 
> min and max inclusive to target.  min,max,target are constants. It outputs 
> the field's value if it does not fall between min and max.
> + <!> [[Solr1.3]] map(x,min,max,target) maps any values of the function x 
> that fall within min and max inclusive to target.  min,max,target are 
> constants. It outputs the field's value if it does not fall between min and 
> max.
> +
> -     Example Syntax 1: '''map(x,0,0,1)'''  change any values of 0 to 1... 
> useful in handling default 0 values
> +  . Example Syntax 1: '''map(x,0,0,1)'''  change any values of 0 to 1... 
> useful in handling default 0 values
> -
> -     Example Syntax 2 <!> [[Solr1.4]]: '''map(x,0,0,1,0)'''  change any 
> values of 0 to 1 . and if the value is not zero it can be set to the value of 
> the 5th argument instead of defaulting to the field's value
> +  Example Syntax 2 <!> [[Solr1.4]]: '''map(x,0,0,1,0)'''  change any values 
> of 0 to 1 . and if the value is not zero it can be set to the value of the 
> 5th argument instead of defaulting to the field's value
> -
> -
> -
>
>  == scale ==
> - <!> [[Solr1.3]]
> - scale(x,minTarget,maxTarget) scales values of the function x such that they 
> fall between minTarget and maxTarget inclusive.
> + <!> [[Solr1.3]] scale(x,minTarget,maxTarget) scales values of the function 
> x such that they fall between minTarget and maxTarget inclusive.
> -     Example Syntax: '''scale(x,1,2)'''  all values will be between 1 and 2 
> inclusive.
>
> -     NOTE: The current implementation currently traverses all of the 
> function values to obtain the min and max so it can pick the correct scale.
> +  . Example Syntax: '''scale(x,1,2)'''  all values will be between 1 and 2 
> inclusive. NOTE: The current implementation currently traverses all of the 
> function values to obtain the min and max so it can pick the correct scale.
> -
> -     NOTE: This implementation currently cannot distinguish when documents 
> have been deleted or documents that have no value, and 0.0 values will be 
> used for these cases.  This means that if values are normally all greater 
> than 0.0, one can still end up with 0.0 as the min value to map from.  In 
> these cases, an appropriate map() function could be used as a workaround to 
> change 0.0 to a value in the real range.  example: 
> '''scale(map(x,0,0,5),1,2)'''
> +  NOTE: This implementation currently cannot distinguish when documents have 
> been deleted or documents that have no value, and 0.0 values will be used for 
> these cases.  This means that if values are normally all greater than 0.0, 
> one can still end up with 0.0 as the min value to map from.  In these cases, 
> an appropriate map() function could be used as a workaround to change 0.0 to 
> a value in the real range.  example: '''scale(map(x,0,0,5),1,2)'''
>
>  == query ==
> - <!> [[Solr1.4]]
> - query(subquery, default) returns the score for the given subquery, or the 
> default value for documents not matching the query.  Any type of subquery is 
> supported through either parameter dereferencing {{{$otherparam}}} or direct 
> specification of the query string in the LocalParams via "v".
> + <!> [[Solr1.4]] query(subquery, default) returns the score for the given 
> subquery, or the default value for documents not matching the query.  Any 
> type of subquery is supported through either parameter dereferencing 
> {{{$otherparam}}} or direct specification of the query string in the 
> LocalParams via "v".
>
> -     Example Syntax: '''q=product(popularity, query({!dismax v='solr 
> rocks'})''' returns the product of the popularity and the score of the dismax 
> query.
> +  . Example Syntax: '''q=product(popularity, query({!dismax v='solr 
> rocks'})''' returns the product of the popularity and the score of the dismax 
> query.
> -
> -     Example Syntax: '''q=product(popularity, query($qq))&qq={!dismax}solr 
> rocks''' is equivalent to the previous query, using param dereferencing.
> +  Example Syntax: '''q=product(popularity, query($qq))&qq={!dismax}solr 
> rocks''' is equivalent to the previous query, using param dereferencing.
> -
> -     Example Syntax: '''q=product(popularity, 
> query($qq,0.1))&qq={!dismax}solr rocks''' specifies a default score of 0.1 
> for documents that don't match the dismax query.
> +  Example Syntax: '''q=product(popularity, query($qq,0.1))&qq={!dismax}solr 
> rocks''' specifies a default score of 0.1 for documents that don't match the 
> dismax query.
>
>  == linear ==
>  linear(x,m,c) implements m*x+c where m and c are constants and x is an 
> arbitrary function.  This is equivalent to '''sum(product(m,x),c)''', but 
> slightly more efficient as it is implemented as a single function.
> +
> -     Example Syntax: '''linear(x,2,4)'''  returns 2*x+4
> +  . Example Syntax: '''linear(x,2,4)'''  returns 2*x+4
>
>  == recip ==
>  A reciprocal function with '''recip(x,m,a,b)''' implementing a/(m*x+b).  
> m,a,b are constants, x is any numeric field or arbitrarily complex function.
>
>  When a and b are equal, and x>=0, this function has a maximum value of 1 
> that drops as x increases. Increasing the value of a and b together results 
> in a movement of the entire function to a flatter part of the curve. These 
> properties can make this an ideal function for boosting more recent documents 
> when x is rord(datefield).
> +
> -     Example Syntax: '''recip(rord(creationDate),1,1000,1000)'''
> +  . Example Syntax: '''recip(rord(creationDate),1,1000,1000)'''
>
> - <!> [[Solr1.4]]
> - In Solr 1.4 and later, best practice is to avoid ord() and rord() and 
> derive the boost directly from the value of the date field.
> + <!> [[Solr1.4]] In Solr 1.4 and later, best practice is to avoid ord() and 
> rord() and derive the boost directly from the value of the date field. See 
> ms() for more details.
> - See ms() for more details.
>
>  == max ==
>  max(x,c) returns the max of another function and a constant.  Useful for 
> "bottoming out" another function at some constant.
> +
> -     Example Syntax: '''max(myfield,0)'''
> +  . Example Syntax: '''max(myfield,0)'''
>
>  == ms ==
>  <!> [[Solr1.4]]
> @@ -175, +149 @@
>
>  Arguments may be numerically indexed date fields such as !TrieDate (the 
> default in 1.4), or date math (examples in SolrQuerySyntax) based on a 
> constant date or '''NOW'''.
>
>  '''ms()'''
> +
> -   Equivalent to '''ms(NOW)''', number of milliseconds since the epoch.
> +  . Equivalent to '''ms(NOW)''', number of milliseconds since the epoch.
> +
>  '''ms(a)'''
> +
> -   Returns the number of milliseconds since the epoch that the argument 
> represents.
> +  . Returns the number of milliseconds since the epoch that the argument 
> represents.
> -
> -   Example: '''ms(NOW/DAY)'''
> +  Example: '''ms(NOW/DAY)'''
> -
> -   Example: '''ms(2000-01-01T00:00:00Z)'''
> +  Example: '''ms(2000-01-01T00:00:00Z)'''
> -
> -   Example: '''ms(mydatefield)'''
> +  Example: '''ms(mydatefield)'''
> +
>  '''ms(a,b)'''
> +
> -   Returns the number of milliseconds that {{{b}}} occurs before {{{a}}} 
> (i.e. {{{a - b}}}).  Note that this offers higher precision than 
> '''sub(a,b)''' because the arguments are not converted to floating point 
> numbers before subtraction.
> +  . Returns the number of milliseconds that {{{b}}} occurs before {{{a}}} 
> (i.e. {{{a - b}}}).  Note that this offers higher precision than 
> '''sub(a,b)''' because the arguments are not converted to floating point 
> numbers before subtraction.
> -
> -   Example: '''ms(NOW,mydatefield)'''
> +  Example: '''ms(NOW,mydatefield)'''
> -
> -   Example: '''ms(mydatefield,2000-01-01T00:00:00Z)'''
> +  Example: '''ms(mydatefield,2000-01-01T00:00:00Z)'''
> -
> -   Example: '''ms(datefield1,datefield2)'''
> +  Example: '''ms(datefield1,datefield2)'''
> +
> + == dist ==
> + [[Solr1.5]]
> +
> + Return the Distance between two Vectors (points) in an n-dimensional space. 
>  See http://en.wikipedia.org/wiki/Lp_space for more information.  Takes in 
> the power, plus two or more !ValueSource instances and calculates the 
> distances between the two vectors.  Each !ValueSource must be a number.
> +
> + Common cases:
> +
> +  ||<tablestyle="width: 467px; height: 88px;">Power ||Common Name ||
> +  ||0 ||Sparseness calculation ||
> +  ||1||Manhattan (taxicab) Distance||
> +  ||2||Euclidean Distance||
> +  ||Infinite||Infinite norm - maximum value in the vector||
> +
> +
>
>  === Date Boosting ===
>  Boosting more recent content is a common use case.  One way is to use a 
> {{{recip}}} function in conjunction with {{{ms}}}.
> @@ -203, +191 @@
>
>  Also see 
> http://wiki.apache.org/solr/SolrRelevancyFAQ#How_can_I_boost_the_score_of_newer_documents
>
>  == top ==
> - <!> [[Solr1.4]]
> - Causes it's function query argument to derive it's values from the 
> top-level IndexReader containing all parts of an index.  For example, the 
> ordinal of a value in a single segment will be different from the ordinal of 
> that same value in the complete index.  The ord() and rord() functions 
> implicitly use top() and hence ord(foo) is equivalent to top(ord(foo)).
> + <!> [[Solr1.4]] Causes it's function query argument to derive it's values 
> from the top-level IndexReader containing all parts of an index.  For 
> example, the ordinal of a value in a single segment will be different from 
> the ordinal of that same value in the complete index.  The ord() and rord() 
> functions implicitly use top() and hence ord(foo) is equivalent to 
> top(ord(foo)).
>
>  = General Example =
> -
> - To give more idea about the use of the function query, suppose index stores 
> dimensions in meters '''x''', '''y''','''z''' of some hypothetical boxes with 
> arbitrary names stored in field '''boxname'''.
> + To give more idea about the use of the function query, suppose index stores 
> dimensions in meters '''x''', '''y''','''z''' of some hypothetical boxes with 
> arbitrary names stored in field '''boxname'''. Suppose we want to search for 
> box matching name ''findbox'' but ranked according to volumes of boxes, the 
> query params would be:
> - Suppose we want to search for box matching name ''findbox'' but ranked 
> according to volumes of boxes, the query params would be:
> +
>  {{{
>    q=boxname:findbox+_val_:"product(product(x,y),z)"
>  }}}
> -
>  Although this will rank the results based on volumes but in order to get the 
> computed volume you will need to add parameter...
> +
>  {{{
>    &fl=*,score
>  }}}
> -
>  ...where '''score''' will contain the resultant volume.
>
>  Suppose you also have a field containing weight of the box as 'weight', then 
> to sort by the density of the box and return the value of the density in 
> score you query should be...
> @@ -226, +211 @@
>
>  {{{
>  http://localhost:8983/solr/select/?q=boxname:findbox+_val_:"div(weight,product(product(x,y),z))"&fl=boxname,x,y,z,weight,score
>  }}}
> -
>
>

Reply via email to